From de4903be5610b9b47d4120a5a223faac4ca00693 Mon Sep 17 00:00:00 2001 From: Ward Bell Date: Thu, 26 Jan 2017 03:26:11 -0800 Subject: [PATCH] chore: Angular 1 -> AngularJS / Angular 2 -> Angular (#3143) * chore: Angular 1 -> AngularJS / Angular 2 -> Angular * Jesus' tweaks --- README.md | 5 +- firebase.json | 6 +- harp.json | 26 +- public/cardboard/index.jade | 2 +- .../cb-a1-a2-quick-reference/ts/plnkr.json | 9 - .../e2e-spec.ts | 4 +- .../ts/app/app-routing.module.ts | 0 .../ts/app/app.component.css | 0 .../ts/app/app.component.html | 0 .../ts/app/app.component.ts | 2 +- .../ts/app/app.module.1.ts | 0 .../ts/app/app.module.ts | 0 .../ts/app/date.pipe.ts | 0 .../ts/app/main.ts | 0 .../ts/app/movie-list.component.css | 0 .../ts/app/movie-list.component.html | 0 .../ts/app/movie-list.component.ts | 0 .../ts/app/movie.service.ts | 0 .../ts/app/movie.ts | 0 .../ts/example-config.json | 0 .../ts/images/hero.png | Bin .../ts/images/ng-logo.png | Bin .../ts/images/villain.png | Bin .../ts/index.html | 2 +- .../cb-ajs-quick-reference/ts/plnkr.json | 9 + public/docs/_examples/cb-i18n/e2e-spec.ts | 2 +- .../cb-i18n/ts/app/app.component.1.html | 2 +- .../cb-i18n/ts/app/app.component.html | 2 +- .../cb-i18n/ts/locale/messages.es.xlf | 6 +- .../cb-i18n/ts/locale/messages.es.xlf.html | 6 +- public/docs/_examples/cb-i18n/ts/messages.xlf | 10 +- .../ts/index-1-2-hybrid-bootstrap.html | 2 +- .../ts/index-1-to-2-projection.html | 2 +- .../ts/index-1-to-2-providers.html | 2 +- .../ts/index-2-to-1-providers.html | 2 +- .../ts/index-2-to-1-transclusion.html | 2 +- .../upgrade-module/ts/index-downgrade-io.html | 2 +- .../ts/index-downgrade-static.html | 2 +- .../upgrade-module/ts/index-upgrade-io.html | 2 +- .../ts/index-upgrade-static.html | 2 +- .../upgrade-phonecat-1-typescript/README.md | 4 +- .../ts/app/core/checkmark/checkmark.filter.ts | 1 - .../ts/run-unit-tests.sh | 2 +- .../upgrade-phonecat-2-hybrid/README.md | 4 +- .../ts/app/app.module.ng1.ts | 2 +- .../ts/karma.conf.ng1.js | 2 +- .../ts/run-unit-tests.sh | 2 +- .../ts/karma.conf.ng1.js | 2 +- .../ts/run-unit-tests.sh | 2 +- public/docs/_includes/styleguide/_tables.jade | 8 +- public/docs/js/latest/cookbook/_data.json | 8 +- ...eference.jade => ajs-quick-reference.jade} | 0 public/docs/js/latest/guide/_data.json | 4 +- public/docs/js/latest/quickstart.jade | 2 +- public/docs/ts/latest/cookbook/_data.json | 8 +- ...eference.jade => ajs-quick-reference.jade} | 244 +++---- public/docs/ts/latest/cookbook/ts-to-js.jade | 2 +- .../latest/cookbook/visual-studio-2015.jade | 6 +- public/docs/ts/latest/guide/_data.json | 4 +- public/docs/ts/latest/guide/change-log.jade | 6 +- .../docs/ts/latest/guide/lifecycle-hooks.jade | 2 +- public/docs/ts/latest/guide/npm-packages.jade | 2 +- public/docs/ts/latest/guide/pipes.jade | 10 +- public/docs/ts/latest/guide/upgrade.jade | 679 +++++++++--------- public/docs/ts/latest/help-new.jade | 4 +- public/docs/ts/latest/index.jade | 2 +- .../upgrade/a-to-ajs-with-transclusion.png | Bin 0 -> 4532 bytes .../images/devguide/upgrade/a-to-ajs.png | Bin 0 -> 2451 bytes .../upgrade/a1-to-a2-with-projection.png | Bin 7679 -> 0 bytes .../images/devguide/upgrade/a1-to-a2.png | Bin 2522 -> 0 bytes .../upgrade/a2-to-a1-with-transclusion.png | Bin 7773 -> 0 bytes .../images/devguide/upgrade/a2-to-a1.png | Bin 2559 -> 0 bytes .../upgrade/ajs-to-a-with-projection.png | Bin 0 -> 4709 bytes .../images/devguide/upgrade/ajs-to-a.png | Bin 0 -> 2466 bytes .../devguide/upgrade/change_detection.png | Bin 31503 -> 10664 bytes .../resources/images/devguide/upgrade/dom.png | Bin 5583 -> 7941 bytes .../images/devguide/upgrade/injectors-2.png | Bin 0 -> 12187 bytes .../images/devguide/upgrade/injectors.png | Bin 41965 -> 12225 bytes .../multiregion/mainBlankDocPlaster.ts | 4 +- .../_test/test_source/no-multiregion/main.ts | 4 +- .../no-multiregion/nested-regions.ts | 4 +- 81 files changed, 575 insertions(+), 560 deletions(-) delete mode 100644 public/docs/_examples/cb-a1-a2-quick-reference/ts/plnkr.json rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/e2e-spec.ts (96%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/app-routing.module.ts (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/app.component.css (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/app.component.html (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/app.component.ts (92%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/app.module.1.ts (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/app.module.ts (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/date.pipe.ts (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/main.ts (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/movie-list.component.css (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/movie-list.component.html (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/movie-list.component.ts (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/movie.service.ts (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/app/movie.ts (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/example-config.json (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/images/hero.png (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/images/ng-logo.png (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/images/villain.png (100%) rename public/docs/_examples/{cb-a1-a2-quick-reference => cb-ajs-quick-reference}/ts/index.html (92%) create mode 100644 public/docs/_examples/cb-ajs-quick-reference/ts/plnkr.json rename public/docs/js/latest/cookbook/{a1-a2-quick-reference.jade => ajs-quick-reference.jade} (100%) rename public/docs/ts/latest/cookbook/{a1-a2-quick-reference.jade => ajs-quick-reference.jade} (66%) create mode 100644 public/resources/images/devguide/upgrade/a-to-ajs-with-transclusion.png create mode 100644 public/resources/images/devguide/upgrade/a-to-ajs.png delete mode 100644 public/resources/images/devguide/upgrade/a1-to-a2-with-projection.png delete mode 100644 public/resources/images/devguide/upgrade/a1-to-a2.png delete mode 100644 public/resources/images/devguide/upgrade/a2-to-a1-with-transclusion.png delete mode 100644 public/resources/images/devguide/upgrade/a2-to-a1.png create mode 100644 public/resources/images/devguide/upgrade/ajs-to-a-with-projection.png create mode 100644 public/resources/images/devguide/upgrade/ajs-to-a.png create mode 100644 public/resources/images/devguide/upgrade/injectors-2.png diff --git a/README.md b/README.md index 0f1eee34be..41288b8975 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Angular.io is site for Angular **documentation** . This site also includes links to other helpful angular resources including -Angular 2, Angular 1, Angular Material, and AngularFire. +AngularJS, Angular Material, and AngularFire. ## Issues @@ -140,7 +140,8 @@ gulp install-example-angular ## Technology Used -- Angular 1.x: The production ready version of Angular +- Angular: Current Angular +- AngularJS: A v.1.x version of Angular - Angular Material: An implementation of Material Design in Angular.js - Gulp: node-based tooling - Harp: The static web server with built-in preprocessing. diff --git a/firebase.json b/firebase.json index 2af13c01ba..9a03643e39 100644 --- a/firebase.json +++ b/firebase.json @@ -57,6 +57,10 @@ "source": "/docs/js/latest/tutorial", "destination": "/docs/js/latest/index.html" }, + { + "source": "/docs/ts/latest/cookbook/a1-a2-quick-reference.html", + "destination": "/docs/ts/latest/cookbook/ajs-quick-reference.html" + }, { "source": "/docs/ts/latest/guide/setup.html", "destination": "/docs/ts/latest/index.html" @@ -109,4 +113,4 @@ "docs/dart/**" ] } -} \ No newline at end of file +} diff --git a/harp.json b/harp.json index a42fd27f91..d539ab5c43 100644 --- a/harp.json +++ b/harp.json @@ -56,7 +56,7 @@ "picture": "/resources/images/bios/jelbourn.jpg", "twitter": "jelbourn", "website": "https://plus.google.com/+JeremyElbourn/", - "bio": "Angular Material 2 Team Lead. FE Engineer @ Google specializing in AngularJS, component design, and the cleanest of code.", + "bio": "Angular Material Team Lead. FE Engineer @ Google specializing in AngularJS, component design, and the cleanest of code.", "type": "Lead" }, @@ -65,7 +65,7 @@ "picture": "/resources/images/bios/pete.jpg", "twitter": "petebd", "website": "http://www.bacondarwin.com", - "bio": "Angular 1 for JS Team Lead. Pete has been working on the core team since 2012 and became the team lead for the Angular 1 for JS branch in November 2014. He has co-authored a book on AngularJS and regularly talks about and teaches Angular.", + "bio": "AngularJS for JS Team Lead. Pete has been working on the core team since 2012 and became the team lead for the AngularJS for JS branch in November 2014. He has co-authored a book on AngularJS and regularly talks about and teaches Angular.", "type": "Lead" }, @@ -74,7 +74,7 @@ "picture": "/resources/images/bios/thomas.jpg", "twitter": "ThomasBurleson", "website": "http://www.solutionOptimist.com", - "bio": "Angular Material 1.x and @angular/flex-layout Team Lead. Thomas joined the core team in 2014. He leads a team of developers working on UX components for Angular 1.x.", + "bio": "AngularJS Material and @angular/flex-layout Team Lead. Thomas joined the core team in 2014. He leads a team of developers working on UX components for AngularJS.", "type": "Lead" }, "stephenfluin": { @@ -98,7 +98,7 @@ "picture": "/resources/images/bios/xiaofei.jpg", "twitter": "", "website": "http://github.com/damoqiongqiu", - "bio": "Aaron is Angular's developer PM in China. He is the lead for angular.cn and social channels in China, and helps developers in China's enterprise and open source communities to be successful with Angular. One of the earliest Angular developers in China since 2012, he translated the first books on Angular into Chinese. Aaron joined the Google team in 2016.", + "bio": "Aaron is Angular's developer PM in China. He is the lead for angular.cn and social channels in China, and helps developers in China's enterprise and open source communities to be successful with Angular. One of the earliest Angular developers in China since Angular 2012, he translated the first books on Angular into Chinese. Aaron joined the Google team in 2016.", "type": "Google" }, "tobias": { @@ -159,7 +159,7 @@ "picture": "/resources/images/bios/alex-rickabaugh.jpg", "twitter": "synalx", "website": "https://plus.google.com/+AlexRickabaugh/about", - "bio": "Core team member working to optimize the Angular platform for the next generation of applications, including mobile. Before joining the Angular team, Alex worked in the Google sales organization where he helped build the first large Angular2 application within Google.", + "bio": "Core team member working to optimize the Angular platform for the next generation of applications, including mobile. Before joining the Angular team, Alex worked in the Google sales organization where he helped build the first large Angular application within Google.", "type": "Google" }, @@ -195,7 +195,7 @@ "picture": "/resources/images/bios/victor.jpg", "twitter": "victorsavkin", "website": "http://victorsavkin.com/", - "bio": "Victor has been on the Angular team since the inception of Angular 2. While at Google, Victor developed dependency injection, change detection, forms, and the router. Today he is a co-founder at nrwl.io.", + "bio": "Victor has been on the Angular team since the inception of Angular. While at Google, Victor developed dependency injection, change detection, forms, and the router. Today he is a co-founder at nrwl.io.", "type": "Community" }, "jeffcross": { @@ -203,7 +203,7 @@ "picture": "/resources/images/bios/jeff-cross.jpg", "twitter": "jeffbcross", "website": "https://twitter.com/jeffbcross", - "bio": "Jeff was one of the earliest core team members on Angular 1. He developed the Angular 2 http and AngularFire2 modules, contributed to RxJS 5, and was most recently the Tech Lead of the Angular Mobile team at Google. Jeff is a former Googler and co-founder at nrwl.io.", + "bio": "Jeff was one of the earliest core team members on AngularJS. He developed the Angular http and AngularFire modules, contributed to RxJS 5, and was most recently the Tech Lead of the Angular Mobile team at Google. Jeff is a former Googler and co-founder at nrwl.io.", "type": "Community" }, "alexwolfe": { @@ -220,7 +220,7 @@ "picture": "/resources/images/bios/marcy.jpg", "twitter": "marcysutton", "website": "http://marcysutton.com", - "bio": "Marcy Sutton is a senior front-end engineer at Deque Systems, where she works on the axe-core team focusing on accessibility test integrations. Marcy is passionate about making the web accessible for everyone. She is a core team member to ngMaterial 1 and 2, where she regularly brings her accessibility expertise to the table–she is also a primary contributor to the ngAria module as well as an accessibility plugin for Protractor. She's in love with riding bicycles and snowboards and can often be found outside.", + "bio": "Marcy Sutton is a senior front-end engineer at Deque Systems, where she works on the axe-core team focusing on accessibility test integrations. Marcy is passionate about making the web accessible for everyone. She is a core team member to Angular Material, where she regularly brings her accessibility expertise to the table–she is also a primary contributor to the ngAria module as well as an accessibility plugin for Protractor. She's in love with riding bicycles and snowboards and can often be found outside.", "type": "Community" }, @@ -303,7 +303,7 @@ "picture": "/resources/images/bios/michal.jpg", "twitter": "m_gol", "website": "https://plus.google.com/u/0/103101124310040612163/", - "bio": "Front-end developer at Laboratorium EE, core contributor to Angular & jQuery. Makes sure Angular 1 & jQuery work fine together. Interested in new JavaScript standards.", + "bio": "Front-end developer at Laboratorium EE, core contributor to Angular & jQuery. Makes sure AngularJS & jQuery work fine together. Interested in new JavaScript standards.", "type": "Community" }, @@ -345,7 +345,7 @@ "picture": "/resources/images/bios/patrick-stapleton.jpg", "twitter": "gdi2290", "website": "https://angularclass.com", - "bio": "Also know as PatrickJS where JS stands for his middle and last names. Patrick is very active in Open-Source with over 4,300+ contributions in the last year alone on projects such as Angular2, AngularJS, FalcorJS, Docker, Bootstrap, gulp, and redis to name a few. He is also working on the development of Angular server-side rendering as Universal Angular and teaching Modern Web Development at AngularClass. He was previously the CTO of Keychain Logistics, a HackReactor Instructor and Alum.", + "bio": "Also know as PatrickJS where JS stands for his middle and last names. Patrick is very active in Open-Source with over 4,300+ contributions in the last year alone on projects such as Angular, AngularJS, FalcorJS, Docker, Bootstrap, gulp, and redis to name a few. He is also working on the development of Angular server-side rendering as Universal Angular and teaching Modern Web Development at AngularClass. He was previously the CTO of Keychain Logistics, a HackReactor Instructor and Alum.", "type": "Community" }, @@ -378,7 +378,7 @@ "name": "Martin Staffa", "picture": "/resources/images/bios/martinstaffa.jpg", "twitter": "Narretz", - "bio": "Martin is an English major turned web developer who loves frontend stuff. He's been part of the Angular 1 team since 2014. If you can't find him roaming the Github issue queues, he's probably out with his camera somewhere.", + "bio": "Martin is an English major turned web developer who loves frontend stuff. He's been part of the AngularJS team since 2014. If you can't find him roaming the Github issue queues, he's probably out with his camera somewhere.", "type": "Community" }, @@ -414,7 +414,7 @@ "picture": "/resources/images/bios/deborah.jpg", "twitter": "deborahkurata", "website": "http://blogs.msmvps.com/deborahk/", - "bio": "Deborah is an independent software developer and author. She is author of several Pluralsight courses including: 'Angular 2: Getting Started'", + "bio": "Deborah is an independent software developer and author. She is author of several Pluralsight courses including: 'Angular: Getting Started'", "type": "Community" }, @@ -516,7 +516,7 @@ "picture": "/resources/images/bios/devversion.jpg", "website": "http://github.com/DevVersion/", "twitter": "DevVersion", - "bio": "Paul is an aspiring 16-year-old developer living in Germany. While attending school, Paul works as a core team member on the Angular Material projects. He is a prolific contributor to all aspects of Angular 1 and Angular 2 and hopes to work at Google during his college studies!", + "bio": "Paul is an aspiring 16-year-old developer living in Germany. While attending school, Paul works as a core team member on the Angular Material projects. He is a prolific contributor to all aspects of AngularJS and Angular and hopes to work at Google during his college studies!", "type": "Community" }, diff --git a/public/cardboard/index.jade b/public/cardboard/index.jade index 57a8b0bbb6..a0a76d0e80 100644 --- a/public/cardboard/index.jade +++ b/public/cardboard/index.jade @@ -30,7 +30,7 @@ style(rel='stylesheet'). li. Best Technology Demonstration
- Huge hint: Angular 2 scores points + Huge hint: Angular scores points p Don’t have Cardboard and want one? Check out: p.text-center diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/plnkr.json b/public/docs/_examples/cb-a1-a2-quick-reference/ts/plnkr.json deleted file mode 100644 index 4f3ebce61d..0000000000 --- a/public/docs/_examples/cb-a1-a2-quick-reference/ts/plnkr.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "description": "Angular 1 to Angular 2 Quick Reference", - "files":[ - "!**/*.d.ts", - "!**/*.js", - "!**/*.[1].*" - ], - "tags":["cookbook"] -} diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/e2e-spec.ts b/public/docs/_examples/cb-ajs-quick-reference/e2e-spec.ts similarity index 96% rename from public/docs/_examples/cb-a1-a2-quick-reference/e2e-spec.ts rename to public/docs/_examples/cb-ajs-quick-reference/e2e-spec.ts index 8dac46ddd5..81a5faa5e7 100644 --- a/public/docs/_examples/cb-a1-a2-quick-reference/e2e-spec.ts +++ b/public/docs/_examples/cb-ajs-quick-reference/e2e-spec.ts @@ -1,8 +1,8 @@ -'use strict'; // necessary for es6 output in node +'use strict'; // necessary for es6 output in node import { browser, element, by } from 'protractor'; -describe('Angular 1 to 2 Quick Reference Tests', function () { +describe('AngularJS to Angular Quick Reference Tests', function () { beforeAll(function () { browser.get(''); diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app-routing.module.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/app-routing.module.ts similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app-routing.module.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/app-routing.module.ts diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.component.css b/public/docs/_examples/cb-ajs-quick-reference/ts/app/app.component.css similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.component.css rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/app.component.css diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.component.html b/public/docs/_examples/cb-ajs-quick-reference/ts/app/app.component.html similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.component.html rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/app.component.html diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.component.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/app.component.ts similarity index 92% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.component.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/app.component.ts index 689e7a22aa..4d708509a1 100644 --- a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.component.ts +++ b/public/docs/_examples/cb-ajs-quick-reference/ts/app/app.component.ts @@ -20,7 +20,7 @@ export class AppComponent { movie: IMovie = null; movies: IMovie[] = []; showImage = true; - title: string = 'A1-A2 Quick Ref Cookbook'; + title: string = 'AngularJS to Angular Quick Ref Cookbook'; toggleImage(event: UIEvent) { this.showImage = !this.showImage; this.eventType = (event && event.type) || 'not provided'; diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.module.1.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/app.module.1.ts similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.module.1.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/app.module.1.ts diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.module.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/app.module.ts similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/app.module.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/app.module.ts diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/date.pipe.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/date.pipe.ts similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/date.pipe.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/date.pipe.ts diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/main.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/main.ts similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/main.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/main.ts diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie-list.component.css b/public/docs/_examples/cb-ajs-quick-reference/ts/app/movie-list.component.css similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie-list.component.css rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/movie-list.component.css diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie-list.component.html b/public/docs/_examples/cb-ajs-quick-reference/ts/app/movie-list.component.html similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie-list.component.html rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/movie-list.component.html diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie-list.component.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/movie-list.component.ts similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie-list.component.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/movie-list.component.ts diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie.service.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/movie.service.ts similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie.service.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/movie.service.ts diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie.ts b/public/docs/_examples/cb-ajs-quick-reference/ts/app/movie.ts similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/app/movie.ts rename to public/docs/_examples/cb-ajs-quick-reference/ts/app/movie.ts diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/example-config.json b/public/docs/_examples/cb-ajs-quick-reference/ts/example-config.json similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/example-config.json rename to public/docs/_examples/cb-ajs-quick-reference/ts/example-config.json diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/images/hero.png b/public/docs/_examples/cb-ajs-quick-reference/ts/images/hero.png similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/images/hero.png rename to public/docs/_examples/cb-ajs-quick-reference/ts/images/hero.png diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/images/ng-logo.png b/public/docs/_examples/cb-ajs-quick-reference/ts/images/ng-logo.png similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/images/ng-logo.png rename to public/docs/_examples/cb-ajs-quick-reference/ts/images/ng-logo.png diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/images/villain.png b/public/docs/_examples/cb-ajs-quick-reference/ts/images/villain.png similarity index 100% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/images/villain.png rename to public/docs/_examples/cb-ajs-quick-reference/ts/images/villain.png diff --git a/public/docs/_examples/cb-a1-a2-quick-reference/ts/index.html b/public/docs/_examples/cb-ajs-quick-reference/ts/index.html similarity index 92% rename from public/docs/_examples/cb-a1-a2-quick-reference/ts/index.html rename to public/docs/_examples/cb-ajs-quick-reference/ts/index.html index f17a417c95..846a5793c2 100644 --- a/public/docs/_examples/cb-a1-a2-quick-reference/ts/index.html +++ b/public/docs/_examples/cb-ajs-quick-reference/ts/index.html @@ -3,7 +3,7 @@ - Angular 1 to Angular 2 Quick Reference + AngularJS to Angular Quick Reference diff --git a/public/docs/_examples/cb-ajs-quick-reference/ts/plnkr.json b/public/docs/_examples/cb-ajs-quick-reference/ts/plnkr.json new file mode 100644 index 0000000000..6b91b367d2 --- /dev/null +++ b/public/docs/_examples/cb-ajs-quick-reference/ts/plnkr.json @@ -0,0 +1,9 @@ +{ + "description": "AngularJS to Angular Quick Reference", + "files":[ + "!**/*.d.ts", + "!**/*.js", + "!**/*.[1].*" + ], + "tags":["cookbook", "angularjs"] +} diff --git a/public/docs/_examples/cb-i18n/e2e-spec.ts b/public/docs/_examples/cb-i18n/e2e-spec.ts index ee66ff6683..3dcca5a670 100644 --- a/public/docs/_examples/cb-i18n/e2e-spec.ts +++ b/public/docs/_examples/cb-i18n/e2e-spec.ts @@ -19,7 +19,7 @@ describe('i18n E2E Tests', () => { it('should display the translated title attribute', function () { const title = element(by.css('img')).getAttribute('title'); - expect(title).toBe('Logo de Angular 2'); + expect(title).toBe('Logo de Angular'); }); it('should display the plural of: a horde of wolves', function () { diff --git a/public/docs/_examples/cb-i18n/ts/app/app.component.1.html b/public/docs/_examples/cb-i18n/ts/app/app.component.1.html index cc19182338..cc7d4f1155 100644 --- a/public/docs/_examples/cb-i18n/ts/app/app.component.1.html +++ b/public/docs/_examples/cb-i18n/ts/app/app.component.1.html @@ -11,5 +11,5 @@ - + diff --git a/public/docs/_examples/cb-i18n/ts/app/app.component.html b/public/docs/_examples/cb-i18n/ts/app/app.component.html index 7c5562bece..39ace24f79 100644 --- a/public/docs/_examples/cb-i18n/ts/app/app.component.html +++ b/public/docs/_examples/cb-i18n/ts/app/app.component.html @@ -18,7 +18,7 @@ I don't output any element either
- +
diff --git a/public/docs/_examples/cb-i18n/ts/locale/messages.es.xlf b/public/docs/_examples/cb-i18n/ts/locale/messages.es.xlf index df053ed9cf..7b813c38dd 100644 --- a/public/docs/_examples/cb-i18n/ts/locale/messages.es.xlf +++ b/public/docs/_examples/cb-i18n/ts/locale/messages.es.xlf @@ -20,9 +20,9 @@ I don't output any element either optional description optional meaning - - Angular 2 logo - Logo de Angular 2 + + Angular logo + Logo de Angular diff --git a/public/docs/_examples/cb-i18n/ts/locale/messages.es.xlf.html b/public/docs/_examples/cb-i18n/ts/locale/messages.es.xlf.html index b0584d7f2e..a6cdccc6c1 100644 --- a/public/docs/_examples/cb-i18n/ts/locale/messages.es.xlf.html +++ b/public/docs/_examples/cb-i18n/ts/locale/messages.es.xlf.html @@ -23,9 +23,9 @@ optional description optional meaning - - Angular 2 logo - Logo de Angular 2 + + Angular logo + Logo de Angular diff --git a/public/docs/_examples/cb-i18n/ts/messages.xlf b/public/docs/_examples/cb-i18n/ts/messages.xlf index be48f69e2b..dee8b65aca 100644 --- a/public/docs/_examples/cb-i18n/ts/messages.xlf +++ b/public/docs/_examples/cb-i18n/ts/messages.xlf @@ -20,8 +20,14 @@ I don't output any element either optional description optional meaning - - Angular 2 logo + + Angular logo + + + + + + diff --git a/public/docs/_examples/upgrade-module/ts/index-1-2-hybrid-bootstrap.html b/public/docs/_examples/upgrade-module/ts/index-1-2-hybrid-bootstrap.html index 7a2bb5d6ed..2973a092f7 100644 --- a/public/docs/_examples/upgrade-module/ts/index-1-2-hybrid-bootstrap.html +++ b/public/docs/_examples/upgrade-module/ts/index-1-2-hybrid-bootstrap.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-module/ts/index-1-to-2-projection.html b/public/docs/_examples/upgrade-module/ts/index-1-to-2-projection.html index 580f524394..a6ea80f004 100644 --- a/public/docs/_examples/upgrade-module/ts/index-1-to-2-projection.html +++ b/public/docs/_examples/upgrade-module/ts/index-1-to-2-projection.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-module/ts/index-1-to-2-providers.html b/public/docs/_examples/upgrade-module/ts/index-1-to-2-providers.html index fa3a70d48e..13835851c6 100644 --- a/public/docs/_examples/upgrade-module/ts/index-1-to-2-providers.html +++ b/public/docs/_examples/upgrade-module/ts/index-1-to-2-providers.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-module/ts/index-2-to-1-providers.html b/public/docs/_examples/upgrade-module/ts/index-2-to-1-providers.html index b777ce9c9f..c8936d05d2 100644 --- a/public/docs/_examples/upgrade-module/ts/index-2-to-1-providers.html +++ b/public/docs/_examples/upgrade-module/ts/index-2-to-1-providers.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-module/ts/index-2-to-1-transclusion.html b/public/docs/_examples/upgrade-module/ts/index-2-to-1-transclusion.html index b0ed53f68b..797e0b7848 100644 --- a/public/docs/_examples/upgrade-module/ts/index-2-to-1-transclusion.html +++ b/public/docs/_examples/upgrade-module/ts/index-2-to-1-transclusion.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-module/ts/index-downgrade-io.html b/public/docs/_examples/upgrade-module/ts/index-downgrade-io.html index e0f715a10b..4042303835 100644 --- a/public/docs/_examples/upgrade-module/ts/index-downgrade-io.html +++ b/public/docs/_examples/upgrade-module/ts/index-downgrade-io.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-module/ts/index-downgrade-static.html b/public/docs/_examples/upgrade-module/ts/index-downgrade-static.html index c73da599c3..e219014723 100644 --- a/public/docs/_examples/upgrade-module/ts/index-downgrade-static.html +++ b/public/docs/_examples/upgrade-module/ts/index-downgrade-static.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-module/ts/index-upgrade-io.html b/public/docs/_examples/upgrade-module/ts/index-upgrade-io.html index f016d0fec9..a5a71ae82c 100644 --- a/public/docs/_examples/upgrade-module/ts/index-upgrade-io.html +++ b/public/docs/_examples/upgrade-module/ts/index-upgrade-io.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-module/ts/index-upgrade-static.html b/public/docs/_examples/upgrade-module/ts/index-upgrade-static.html index 1087ae83d9..419a817f96 100644 --- a/public/docs/_examples/upgrade-module/ts/index-upgrade-static.html +++ b/public/docs/_examples/upgrade-module/ts/index-upgrade-static.html @@ -1,7 +1,7 @@ - Angular 2 Upgrade + Angular Upgrade diff --git a/public/docs/_examples/upgrade-phonecat-1-typescript/README.md b/public/docs/_examples/upgrade-phonecat-1-typescript/README.md index 5770656e86..41193bb9bc 100644 --- a/public/docs/_examples/upgrade-phonecat-1-typescript/README.md +++ b/public/docs/_examples/upgrade-phonecat-1-typescript/README.md @@ -6,9 +6,9 @@ The following changes from vanilla Phonecat are applied: * The TypeScript config file shown in the guide is `tsconfig.ng1.json` instead of the default, because we don't want to enable `noImplicitAny` for migration. * Karma config for unit tests is in karma.conf.ng1.js because the boilerplate - Karma config is not compatible with the way Angular 1 tests need to be run. + Karma config is not compatible with the way AngularJS tests need to be run. The shell script run-unit-tests.sh can be used to run the unit tests. -* Instead of using Bower, Angular 1 and its dependencies are fetched from a CDN +* Instead of using Bower, AngularJS and its dependencies are fetched from a CDN in index.html and karma.conf.ng1.js. * E2E tests have been moved to the parent directory, where `gulp run-e2e-tests` can discover and run them along with all the other examples. diff --git a/public/docs/_examples/upgrade-phonecat-1-typescript/ts/app/core/checkmark/checkmark.filter.ts b/public/docs/_examples/upgrade-phonecat-1-typescript/ts/app/core/checkmark/checkmark.filter.ts index b140bd6a84..3114dc9681 100644 --- a/public/docs/_examples/upgrade-phonecat-1-typescript/ts/app/core/checkmark/checkmark.filter.ts +++ b/public/docs/_examples/upgrade-phonecat-1-typescript/ts/app/core/checkmark/checkmark.filter.ts @@ -1,5 +1,4 @@ // #docregion - angular. module('core'). filter('checkmark', function() { diff --git a/public/docs/_examples/upgrade-phonecat-1-typescript/ts/run-unit-tests.sh b/public/docs/_examples/upgrade-phonecat-1-typescript/ts/run-unit-tests.sh index 00a5abb7bc..034dfd249b 100755 --- a/public/docs/_examples/upgrade-phonecat-1-typescript/ts/run-unit-tests.sh +++ b/public/docs/_examples/upgrade-phonecat-1-typescript/ts/run-unit-tests.sh @@ -1,4 +1,4 @@ -## The boilerplate Karma configuration won't work with Angular 1 tests since +## The boilerplate Karma configuration won't work with AngularJS tests since ## a specific loading configuration is needed for them. ## We keep one in karma.conf.ng1.js. This scripts runs the ng1 tests with ## that config. diff --git a/public/docs/_examples/upgrade-phonecat-2-hybrid/README.md b/public/docs/_examples/upgrade-phonecat-2-hybrid/README.md index 4f8e4928af..c1410b19ee 100644 --- a/public/docs/_examples/upgrade-phonecat-2-hybrid/README.md +++ b/public/docs/_examples/upgrade-phonecat-2-hybrid/README.md @@ -4,13 +4,13 @@ structure. The following changes from vanilla Phonecat are applied: * Karma config for unit tests is in karma.conf.ng1.js because the boilerplate - Karma config is not compatible with the way Angular 1 tests need to be run. + Karma config is not compatible with the way AngularJS tests need to be run. The shell script run-unit-tests.sh can be used to run the unit tests. * There's a `package.ng1.json`, which is not used to run anything but only to show an example of changing the PhoneCat http-server root path. * Also for the Karma shim, there is a `karma-test-shim.1.js` file which isn't used but is shown in the test appendix. -* Instead of using Bower, Angular 1 and its dependencies are fetched from a CDN +* Instead of using Bower, AngularJS and its dependencies are fetched from a CDN in index.html and karma.conf.ng1.js. * E2E tests have been moved to the parent directory, where `run-e2e-tests` can discover and run them along with all the other examples. diff --git a/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/app/app.module.ng1.ts b/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/app/app.module.ng1.ts index e493137966..089c3c7d85 100644 --- a/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/app/app.module.ng1.ts +++ b/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/app/app.module.ng1.ts @@ -1,7 +1,7 @@ // #docregion 'use strict'; -// Define the `phonecatApp` Angular 1 module +// Define the `phonecatApp` AngularJS module angular.module('phonecatApp', [ 'ngAnimate', 'ngRoute', diff --git a/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/karma.conf.ng1.js b/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/karma.conf.ng1.js index 7df164da54..a52abf73ce 100644 --- a/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/karma.conf.ng1.js +++ b/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/karma.conf.ng1.js @@ -33,7 +33,7 @@ module.exports = function(config) { { pattern: 'node_modules/rxjs/**/*.js', included: false, watched: false }, { pattern: 'node_modules/rxjs/**/*.js.map', included: false, watched: false }, - // Angular 2 itself and the testing library + // Angular itself and the testing library {pattern: 'node_modules/@angular/**/*.js', included: false, watched: false}, {pattern: 'node_modules/@angular/**/*.js.map', included: false, watched: false}, diff --git a/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/run-unit-tests.sh b/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/run-unit-tests.sh index 00a5abb7bc..034dfd249b 100755 --- a/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/run-unit-tests.sh +++ b/public/docs/_examples/upgrade-phonecat-2-hybrid/ts/run-unit-tests.sh @@ -1,4 +1,4 @@ -## The boilerplate Karma configuration won't work with Angular 1 tests since +## The boilerplate Karma configuration won't work with AngularJS tests since ## a specific loading configuration is needed for them. ## We keep one in karma.conf.ng1.js. This scripts runs the ng1 tests with ## that config. diff --git a/public/docs/_examples/upgrade-phonecat-3-final/ts/karma.conf.ng1.js b/public/docs/_examples/upgrade-phonecat-3-final/ts/karma.conf.ng1.js index 7df164da54..a52abf73ce 100644 --- a/public/docs/_examples/upgrade-phonecat-3-final/ts/karma.conf.ng1.js +++ b/public/docs/_examples/upgrade-phonecat-3-final/ts/karma.conf.ng1.js @@ -33,7 +33,7 @@ module.exports = function(config) { { pattern: 'node_modules/rxjs/**/*.js', included: false, watched: false }, { pattern: 'node_modules/rxjs/**/*.js.map', included: false, watched: false }, - // Angular 2 itself and the testing library + // Angular itself and the testing library {pattern: 'node_modules/@angular/**/*.js', included: false, watched: false}, {pattern: 'node_modules/@angular/**/*.js.map', included: false, watched: false}, diff --git a/public/docs/_examples/upgrade-phonecat-3-final/ts/run-unit-tests.sh b/public/docs/_examples/upgrade-phonecat-3-final/ts/run-unit-tests.sh index 00a5abb7bc..034dfd249b 100755 --- a/public/docs/_examples/upgrade-phonecat-3-final/ts/run-unit-tests.sh +++ b/public/docs/_examples/upgrade-phonecat-3-final/ts/run-unit-tests.sh @@ -1,4 +1,4 @@ -## The boilerplate Karma configuration won't work with Angular 1 tests since +## The boilerplate Karma configuration won't work with AngularJS tests since ## a specific loading configuration is needed for them. ## We keep one in karma.conf.ng1.js. This scripts runs the ng1 tests with ## that config. diff --git a/public/docs/_includes/styleguide/_tables.jade b/public/docs/_includes/styleguide/_tables.jade index bc370e5250..738a8dc873 100644 --- a/public/docs/_includes/styleguide/_tables.jade +++ b/public/docs/_includes/styleguide/_tables.jade @@ -15,15 +15,15 @@ th Task th Speed tr - td Angular 1.3 + td AngularJS v.1.3 td Routing td fast tr - td Angular 1.4 + td AngularJS v.1.4 td Routing td faster tr - td Angular 2 + td Angular td Routing td fastest :) @@ -35,6 +35,6 @@ th Task th Speed tr - td Angular 1.3 + td AngularJS v.1.3 td Routing td fast diff --git a/public/docs/js/latest/cookbook/_data.json b/public/docs/js/latest/cookbook/_data.json index 74ee2a0be9..166fc94f39 100644 --- a/public/docs/js/latest/cookbook/_data.json +++ b/public/docs/js/latest/cookbook/_data.json @@ -5,10 +5,10 @@ "intro": "A collection of recipes for common Angular application scenarios" }, - "a1-a2-quick-reference": { - "title": "Angular 1 to 2 Quick Reference", - "navTitle": "Angular 1 to 2 Quick Ref", - "intro": "Learn how Angular 1 concepts and techniques map to Angular 2" + "ajs-quick-reference": { + "title": "AngularJS to Angular Quick Reference", + "navTitle": "AngularJS to Angular Quick Ref", + "intro": "Learn how AngularJS concepts and techniques map to Angular" }, "ngmodule-faq": { diff --git a/public/docs/js/latest/cookbook/a1-a2-quick-reference.jade b/public/docs/js/latest/cookbook/ajs-quick-reference.jade similarity index 100% rename from public/docs/js/latest/cookbook/a1-a2-quick-reference.jade rename to public/docs/js/latest/cookbook/ajs-quick-reference.jade diff --git a/public/docs/js/latest/guide/_data.json b/public/docs/js/latest/guide/_data.json index 7bc784f771..f4f95cb12c 100644 --- a/public/docs/js/latest/guide/_data.json +++ b/public/docs/js/latest/guide/_data.json @@ -144,8 +144,8 @@ }, "upgrade": { - "title": "Upgrading from 1.x", - "intro": "Angular 1 applications can be incrementally upgraded to Angular 2." + "title": "Upgrading to Angular", + "intro": "AngularJS applications can be incrementally upgraded to Angular." }, "webpack": { diff --git a/public/docs/js/latest/quickstart.jade b/public/docs/js/latest/quickstart.jade index 600b9f6b94..88f159ba45 100644 --- a/public/docs/js/latest/quickstart.jade +++ b/public/docs/js/latest/quickstart.jade @@ -311,7 +311,7 @@ figure.image-display :marked ### Make some changes - Try changing the message to "Hello Angular 2!". + Try changing the message to "Hello Angular!". `lite-server` is watching, so it should detect the change, refresh the browser, and display the revised message. diff --git a/public/docs/ts/latest/cookbook/_data.json b/public/docs/ts/latest/cookbook/_data.json index e7ffea0ace..c9d38a5651 100644 --- a/public/docs/ts/latest/cookbook/_data.json +++ b/public/docs/ts/latest/cookbook/_data.json @@ -10,10 +10,10 @@ "intro": "Learn how to use Ahead-of-time compilation" }, - "a1-a2-quick-reference": { - "title": "Angular 1 to 2 Quick Reference", - "navTitle": "Angular 1 to 2 Quick Ref", - "intro": "Learn how Angular 1 concepts and techniques map to Angular 2" + "ajs-quick-reference": { + "title": "AngularJS to Angular Quick Reference", + "navTitle": "AngularJS to Angular", + "intro": "Learn how AngularJS concepts and techniques map to Angular" }, "ngmodule-faq": { diff --git a/public/docs/ts/latest/cookbook/a1-a2-quick-reference.jade b/public/docs/ts/latest/cookbook/ajs-quick-reference.jade similarity index 66% rename from public/docs/ts/latest/cookbook/a1-a2-quick-reference.jade rename to public/docs/ts/latest/cookbook/ajs-quick-reference.jade index 7105fa190b..6f661afac8 100644 --- a/public/docs/ts/latest/cookbook/a1-a2-quick-reference.jade +++ b/public/docs/ts/latest/cookbook/ajs-quick-reference.jade @@ -1,12 +1,14 @@ include ../_util-fns a(id="top") :marked - There are many conceptual and syntactical differences between Angular 1 and Angular 2. - This page provides a quick guide to some common Angular 1 - syntax and its equivalent in Angular 2. + _Angular_ is the name for the Angular of today and tomorrow. + _AngularJS_ is the name for all v1.x versions of Angular. + + This guide helps you transition from AngularJS to Angular + by mapping AngularJS syntax to the equivalent Angular syntax. :marked - **See the Angular 2 syntax in this **. + **See the Angular syntax in this **. ## Contents This page covers: @@ -14,25 +16,25 @@ a(id="top") * [Template directives](#template-directives) - built-in directives `ngIf` and `ngClass`. - * [Filters/pipes](#filters-pipes) - built-in *filters*, known as *pipes* in Angular 2. + * [Filters/pipes](#filters-pipes) - built-in *filters*, known as *pipes* in Angular. - * [Modules/controllers/components](#controllers-components) - *modules* in Angular 2 are slightly different from *modules* in Angular 1, and *controllers* are *components* in Angular 2. + * [Modules/controllers/components](#controllers-components) - *modules* in Angular are slightly different from *modules* in AngularJS, and *controllers* are *components* in Angular. - * [Style sheets](#style-sheets) - more options for CSS than in Angular 1. + * [Style sheets](#style-sheets) - more options for CSS than in AngularJS. .l-main-section :marked ## Template basics Templates are the user-facing part of an Angular application and are written in HTML. - The following table lists some of the key Angular 1 template features with their equivalent Angular 2 template syntax. + The following table lists some of the key AngularJS template features with their equivalent Angular template syntax. - var top="vertical-align:top" table(width="100%") col(width="50%") col(width="50%") tr - th Angular 1 - th Angular 2 + th AngularJS + th Angular tr(style=top) td :marked @@ -40,7 +42,7 @@ table(width="100%") code-example. Your favorite hero is: {{vm.favoriteHero}} :marked - In Angular 1, an expression in curly braces denotes one-way binding. + In AngularJS, an expression in curly braces denotes one-way binding. This binds the value of the element to a property in the controller associated with this template. @@ -50,9 +52,9 @@ table(width="100%") td :marked ### Bindings/interpolation - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.html', 'interpolation')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.html', 'interpolation')(format="." ) :marked - In Angular 2, a template expression in curly braces still denotes one-way binding. + In Angular, a template expression in curly braces still denotes one-way binding. This binds the value of the element to a property of the component. The context of the binding is implied and is always the associated component, so it needs no reference variable. @@ -65,17 +67,17 @@ table(width="100%") code-example. <td>{{movie.title | uppercase}}</td> :marked - To filter output in Angular 1 templates, use the pipe character (|) and one or more filters. + To filter output in AngularJS templates, use the pipe character (|) and one or more filters. This example filters the `title` property to uppercase. td :marked ### Pipes - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'uppercase')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'uppercase')(format="." ) :marked - In Angular 2 you use similar syntax with the pipe (|) character to filter output, but now you call them **pipes**. - Many (but not all) of the built-in filters from Angular 1 are - built-in pipes in Angular 2. + In Angular you use similar syntax with the pipe (|) character to filter output, but now you call them **pipes**. + Many (but not all) of the built-in filters from AngularJS are + built-in pipes in Angular. For more information, see the heading [Filters/pipes](#filters-pipes) below. tr(style=top) @@ -91,9 +93,9 @@ table(width="100%") td :marked ### Input variables - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'local')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'local')(format="." ) :marked - Angular 2 has true template input variables that are explicitly defined using the `let` keyword. + Angular has true template input variables that are explicitly defined using the `let` keyword. For more information, see the [ngFor micro-syntax](../guide/template-syntax.html#ngForMicrosyntax) section of the Template Syntax page. :marked @@ -102,16 +104,16 @@ table(width="100%") .l-main-section :marked ## Template directives - Angular 1 provides more than seventy built-in directives for templates. - Many of them aren't needed in Angular 2 because of its more capable and expressive binding system. - The following are some of the key Angular 1 built-in directives and their equivalents in Angular 2. + AngularJS provides more than seventy built-in directives for templates. + Many of them aren't needed in Angular because of its more capable and expressive binding system. + The following are some of the key AngularJS built-in directives and their equivalents in Angular. table(width="100%") col(width="50%") col(width="50%") tr - th Angular 1 - th Angular 2 + th AngularJS + th Angular tr(style=top) td :marked @@ -121,18 +123,18 @@ table(width="100%") :marked The application startup process is called **bootstrapping**. - Although you can bootstrap an Angular 1 app in code, + Although you can bootstrap an AngularJS app in code, many applications bootstrap declaratively with the `ng-app` directive, giving it the name of the application's module (`movieHunter`). td :marked ### Bootstrapping - +makeExample('cb-a1-a2-quick-reference/ts/app/main.ts','','main.ts')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/main.ts','','main.ts')(format="." )
- +makeExample('cb-a1-a2-quick-reference/ts/app/app.module.1.ts','','app.module.ts')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.module.1.ts','','app.module.ts')(format="." ) :marked - Angular 2 doesn't have a bootstrap directive. + Angular doesn't have a bootstrap directive. To launch the app in code, explicitly bootstrap the application's root module (`AppModule`) in `main.ts` and the application's root component (`AppComponent`) in `app.module.ts`. @@ -147,7 +149,7 @@ table(width="100%") <div ng-class="{active: isActive, shazam: isImportant}"> :marked - In Angular 1, the `ng-class` directive includes/excludes CSS classes + In AngularJS, the `ng-class` directive includes/excludes CSS classes based on an expression. That expression is often a key-value control object with each key of the object defined as a CSS class name, and each value defined as a template expression that evaluates to a Boolean value. @@ -158,16 +160,16 @@ table(width="100%") td :marked ### ngClass - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'ngClass')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'ngClass')(format="." ) :marked - In Angular 2, the `ngClass` directive works similarly. + In Angular, the `ngClass` directive works similarly. It includes/excludes CSS classes based on an expression. In the first example, the `active` class is applied to the element if `isActive` is true. You can specify multiple classes, as shown in the second example. - Angular 2 also has **class binding**, which is a good way to add or remove a single class, + Angular also has **class binding**, which is a good way to add or remove a single class, as shown in the third example. For more information see the [Attribute, Class, and Style Bindings](../guide/template-syntax.html#other-bindings) section of the Template Syntax page. @@ -180,7 +182,7 @@ table(width="100%") <button ng-click="vm.toggleImage()"> <button ng-click="vm.toggleImage($event)"> :marked - In Angular 1, the `ng-click` directive allows you to specify custom behavior when an element is clicked. + In AngularJS, the `ng-click` directive allows you to specify custom behavior when an element is clicked. In the first example, when the user clicks the button, the `toggleImage()` method in the controller referenced by the `vm` `controller as` alias is executed. @@ -189,13 +191,13 @@ table(width="100%") td :marked ### bind to the `click` event - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'event-binding')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'event-binding')(format="." ) :marked - Angular 1 event-based directives do not exist in Angular 2. + AngularJS event-based directives do not exist in Angular. Rather, define one-way binding from the template view to the component using **event binding**. For event binding, define the name of the target event within parenthesis and - specify a template statement, in quotes, to the right of the equals. Angular 2 then + specify a template statement, in quotes, to the right of the equals. Angular then sets up an event handler for the target event. When the event is raised, the handler executes the template statement. @@ -215,15 +217,15 @@ table(width="100%") code-example(format=""). <div ng-controller="MovieListCtrl as vm"> :marked - In Angular 1, the `ng-controller` directive attaches a controller to the view. + In AngularJS, the `ng-controller` directive attaches a controller to the view. Using the `ng-controller` (or defining the controller as part of the routing) ties the view to the controller code associated with that view. td :marked ### Component decorator - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.ts', 'component')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.ts', 'component')(format="." ) :marked - In Angular 2, the template no longer specifies its associated controller. + In Angular, the template no longer specifies its associated controller. Rather, the component specifies its associated template as part of the component class decorator. For more information, see [Architecture Overview](../guide/architecture.html#component). @@ -232,12 +234,12 @@ table(width="100%") td :marked ### ng-hide - In Angular 1, the `ng-hide` directive shows or hides the associated HTML element based on + In AngularJS, the `ng-hide` directive shows or hides the associated HTML element based on an expression. For more information, see [ng-show](#ng-show). td :marked ### bind to the `hidden` property - In Angular 2, you use property binding; there is no built-in *hide* directive. + In Angular, you use property binding; there is no built-in *hide* directive. For more information, see [ng-show](#ng-show). tr(style=top) td @@ -246,27 +248,27 @@ table(width="100%") code-example(format=""). <a ng-href="angularDocsUrl">Angular Docs</a> :marked - The `ng-href` directive allows Angular 1 to preprocess the `href` property so that it + The `ng-href` directive allows AngularJS to preprocess the `href` property so that it can replace the binding expression with the appropriate URL before the browser fetches from that URL. - In Angular 1, the `ng-href` is often used to activate a route as part of navigation. + In AngularJS, the `ng-href` is often used to activate a route as part of navigation. code-example(format=""). <a ng-href="#movies">Movies</a> :marked - Routing is handled differently in Angular 2. + Routing is handled differently in Angular. td :marked ### bind to the `href` property - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'href')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'href')(format="." ) :marked - Angular 2, uses property binding; there is no built-in *href* directive. + Angular, uses property binding; there is no built-in *href* directive. Place the element's `href` property in square brackets and set it to a quoted template expression. For more information on property binding, see [Template Syntax](../guide/template-syntax.html#property-binding). - In Angular 2, `href` is no longer used for routing. Routing uses `routerLink`, as shown in the third example. - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'router-link')(format="." ) + In Angular, `href` is no longer used for routing. Routing uses `routerLink`, as shown in the third example. + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'router-link')(format="." ) :marked For more information on routing, see [Routing & Navigation](../guide/router.html#router-link). @@ -277,16 +279,16 @@ table(width="100%") code-example(format=""). <table ng-if="movies.length"> :marked - In Angular 1, the `ng-if` directive removes or recreates a portion of the DOM, + In AngularJS, the `ng-if` directive removes or recreates a portion of the DOM, based on an expression. If the expression is false, the element is removed from the DOM. In this example, the `table` element is removed from the DOM unless the `movies` array has a length greater than zero. td :marked ### *ngIf - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.html', 'ngIf')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.html', 'ngIf')(format="." ) :marked - The `*ngIf` directive in Angular 2 works the same as the `ng-if` directive in Angular 1. It removes or recreates a portion of the DOM based on an expression. + The `*ngIf` directive in Angular works the same as the `ng-if` directive in AngularJS. It removes or recreates a portion of the DOM based on an expression. In this example, the `table` element is removed from the DOM unless the `movies` array has a length. @@ -299,14 +301,14 @@ table(width="100%") code-example(format=""). <input ng-model="vm.favoriteHero"/> :marked - In Angular 1, the `ng-model` directive binds a form control to a property in the controller associated with the template. + In AngularJS, the `ng-model` directive binds a form control to a property in the controller associated with the template. This provides **two-way binding**, whereby any change made to the value in the view is synchronized with the model, and any change to the model is synchronized with the value in the view. td :marked ### ngModel - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.html', 'ngModel')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.html', 'ngModel')(format="." ) :marked - In Angular 2, **two-way binding** is denoted by `[()]`, descriptively referred to as a "banana in a box". This syntax is a shortcut for defining both property binding (from the component to the view) + In Angular, **two-way binding** is denoted by `[()]`, descriptively referred to as a "banana in a box". This syntax is a shortcut for defining both property binding (from the component to the view) and event binding (from the view to the component), thereby providing two-way binding. For more information on two-way binding with ngModel, see [Template Syntax](../guide/template-syntax.html#ngModel). @@ -317,16 +319,16 @@ table(width="100%") code-example(format=""). <tr ng-repeat="movie in vm.movies"> :marked - In Angular 1, the `ng-repeat` directive repeats the associated DOM element + In AngularJS, the `ng-repeat` directive repeats the associated DOM element for each item in the specified collection. In this example, the table row (`tr`) element repeats for each movie object in the collection of movies. td :marked ### *ngFor - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.html', 'ngFor')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.html', 'ngFor')(format="." ) :marked - The `*ngFor` directive in Angular 2 is similar to the `ng-repeat` directive in Angular 1. It repeats the associated DOM element for each item in the specified collection. + The `*ngFor` directive in Angular is similar to the `ng-repeat` directive in AngularJS. It repeats the associated DOM element for each item in the specified collection. More accurately, it turns the defined element (`tr` in this example) and its contents into a template and uses that template to instantiate a view for each item in the list. @@ -345,16 +347,16 @@ table(width="100%") Your favorite hero is: {{vm.favoriteHero}} </h3> :marked - In Angular 1, the `ng-show` directive shows or hides the associated DOM element, based on + In AngularJS, the `ng-show` directive shows or hides the associated DOM element, based on an expression. In this example, the `div` element is shown if the `favoriteHero` variable is truthy. td :marked ### bind to the `hidden` property - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.html', 'hidden')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.html', 'hidden')(format="." ) :marked - Angular 2, uses property binding; there is no built-in *show* directive. + Angular, uses property binding; there is no built-in *show* directive. For hiding and showing elements, bind to the HTML `hidden` property. To conditionally display an element, place the element's `hidden` property in square brackets and @@ -370,15 +372,15 @@ table(width="100%") code-example(format=""). <img ng-src="{{movie.imageurl}}"> :marked - The `ng-src` directive allows Angular 1 to preprocess the `src` property so that it + The `ng-src` directive allows AngularJS to preprocess the `src` property so that it can replace the binding expression with the appropriate URL before the browser fetches from that URL. td :marked ### bind to the `src` property - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'src')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'src')(format="." ) :marked - Angular 2, uses property binding; there is no built-in *src* directive. + Angular, uses property binding; there is no built-in *src* directive. Place the `src` property in square brackets and set it to a quoted template expression. For more information on property binding, see [Template Syntax](../guide/template-syntax.html#property-binding). @@ -389,7 +391,7 @@ table(width="100%") code-example(format=""). <div ng-style="{color: colorPreference}"> :marked - In Angular 1, the `ng-style` directive sets a CSS style on an HTML element + In AngularJS, the `ng-style` directive sets a CSS style on an HTML element based on an expression. That expression is often a key-value control object with each key of the object defined as a CSS style name, and each value defined as an expression that evaluates to a value appropriate for the style. @@ -398,13 +400,13 @@ table(width="100%") td :marked ### ngStyle - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'ngStyle')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'ngStyle')(format="." ) :marked - In Angular 2, the `ngStyle` directive works similarly. It sets a CSS style on an HTML element based on an expression. + In Angular, the `ngStyle` directive works similarly. It sets a CSS style on an HTML element based on an expression. In the first example, the `color` style is set to the current value of the `colorPreference` variable. - Angular 2 also has **style binding**, which is good way to set a single style. This is shown in the second example. + Angular also has **style binding**, which is good way to set a single style. This is shown in the second example. For more information on style binding, see [Template Syntax](../guide/template-syntax.html#style-binding). @@ -427,7 +429,7 @@ table(width="100%") </div> </div> :marked - In Angular 1, the `ng-switch` directive swaps the contents of + In AngularJS, the `ng-switch` directive swaps the contents of an element by selecting one of the templates based on the current value of an expression. In this example, if `favoriteHero` is not set, the template displays "Please enter ...". @@ -437,9 +439,9 @@ table(width="100%") td :marked ### ngSwitch - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.html', 'ngSwitch')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.html', 'ngSwitch')(format="." ) :marked - In Angular 2, the `ngSwitch` directive works similarly. + In Angular, the `ngSwitch` directive works similarly. It displays an element whose `*ngSwitchCase` matches the current `ngSwitch` expression value. In this example, if `favoriteHero` is not set, the `ngSwitch` value is `null` @@ -458,16 +460,16 @@ a(id="filters-pipes") .l-main-section :marked ## Filters/pipes - Angular 2 **pipes** provide formatting and transformation for data in our template, similar to Angular 1 **filters**. - Many of the built-in filters in Angular 1 have corresponding pipes in Angular 2. + Angular **pipes** provide formatting and transformation for data in our template, similar to AngularJS **filters**. + Many of the built-in filters in AngularJS have corresponding pipes in Angular. For more information on pipes, see [Pipes](../guide/pipes.html). table(width="100%") col(width="50%") col(width="50%") tr - th Angular 1 - th Angular 2 + th AngularJS + th Angular tr(style=top) td :marked @@ -479,9 +481,9 @@ table(width="100%") td :marked ### currency - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'currency')(format="." ) + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'currency')(format="." ) :marked - The Angular 2 `currency` pipe is similar although some of the parameters have changed. + The Angular `currency` pipe is similar although some of the parameters have changed. tr(style=top) td :marked @@ -493,9 +495,9 @@ table(width="100%") td :marked ### date - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'date')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'date')(format=".") :marked - The Angular 2 `date` pipe is similar. + The Angular `date` pipe is similar. tr(style=top) td @@ -508,7 +510,7 @@ table(width="100%") td :marked ### none - For performance reasons, no comparable pipe exists in Angular 2. Do all your filtering in the component. If you need the same filtering code in several templates, consider building a custom pipe. + For performance reasons, no comparable pipe exists in Angular. Do all your filtering in the component. If you need the same filtering code in several templates, consider building a custom pipe. tr(style=top) td @@ -521,9 +523,9 @@ table(width="100%") td :marked ### json - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'json')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'json')(format=".") :marked - The Angular 2 `json` pipe does the same thing. + The Angular `json` pipe does the same thing. tr(style=top) td :marked @@ -536,12 +538,12 @@ table(width="100%") td :marked ### slice - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'slice')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'slice')(format=".") :marked The `SlicePipe` does the same thing but the *order of the parameters is reversed*, in keeping with the JavaScript `Slice` method. The first parameter is the starting index; the second is the limit. - As in Angular 1, coding this operation within the component instead could improve performance. + As in AngularJS, coding this operation within the component instead could improve performance. tr(style=top) td :marked @@ -553,9 +555,9 @@ table(width="100%") td :marked ### lowercase - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'lowercase')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'lowercase')(format=".") :marked - The Angular 2 `lowercase` pipe does the same thing. + The Angular `lowercase` pipe does the same thing. tr(style=top) td :marked @@ -567,13 +569,13 @@ table(width="100%") td :marked ### number - +makeExample('cb-a1-a2-quick-reference/ts/app/app.component.html', 'number')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/app.component.html', 'number')(format=".") :marked - The Angular 2 `number` pipe is similar. + The Angular `number` pipe is similar. It provides more functionality when defining the decimal places, as shown in the second example above. - Angular 2 also has a `percent` pipe, which formats a number as a local percentage + Angular also has a `percent` pipe, which formats a number as a local percentage as shown in the third example. tr(style=top) td @@ -587,7 +589,7 @@ table(width="100%") td :marked ### none - For performance reasons, no comparable pipe exists in Angular 2. + For performance reasons, no comparable pipe exists in Angular. Instead, use component code to order or sort results. If you need the same ordering or sorting code in several templates, consider building a custom pipe. :marked @@ -597,20 +599,20 @@ a(id="controllers-components") .l-main-section :marked ## Modules/controllers/components - In both Angular 1 and Angular 2, Angular modules help you organize your application into cohesive blocks of functionality. + In both AngularJS and Angular, Angular modules help you organize your application into cohesive blocks of functionality. - In Angular 1, you write the code that provides the model and the methods for the view in a **controller**. - In Angular 2, you build a **component**. + In AngularJS, you write the code that provides the model and the methods for the view in a **controller**. + In Angular, you build a **component**. - Because much Angular 1 code is in JavaScript, JavaScript code is shown in the Angular 1 column. - The Angular 2 code is shown using TypeScript. + Because much AngularJS code is in JavaScript, JavaScript code is shown in the AngularJS column. + The Angular code is shown using TypeScript. table(width="100%") col(width="50%") col(width="50%") tr - th Angular 1 - th Angular 2 + th AngularJS + th Angular tr(style=top) td :marked @@ -620,12 +622,12 @@ table(width="100%") ... }()); :marked - In Angular 1, you often defined an immediately invoked function expression (or IIFE) around your controller code. + In AngularJS, you often defined an immediately invoked function expression (or IIFE) around your controller code. This kept your controller code out of the global namespace. td :marked ### none - You don't need to worry about this in Angular 2 because you use ES 2015 modules + You don't need to worry about this in Angular because you use ES 2015 modules and modules handle the namespacing for you. For more information on modules, see [Architecture Overview](../guide/architecture.html#module). @@ -636,13 +638,13 @@ table(width="100%") code-example. angular.module("movieHunter", ["ngRoute"]); :marked - In Angular 1, an Angular module keeps track of controllers, services, and other code. The second argument defines the list of other modules that this module depends upon. + In AngularJS, an Angular module keeps track of controllers, services, and other code. The second argument defines the list of other modules that this module depends upon. td :marked ### Angular modules - +makeExample('cb-a1-a2-quick-reference/ts/app/app.module.1.ts')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/app.module.1.ts')(format=".") :marked - Angular 2 modules, defined with the `NgModule` decorator, serve the same purpose: + Angular modules, defined with the `NgModule` decorator, serve the same purpose: - `imports`: specifies the list of other modules that this module depends upon - `declaration`: keeps track of your components, pipes, and directives. @@ -658,7 +660,7 @@ table(width="100%") ["movieService", MovieListCtrl]); :marked - Angular 1, has code in each controller that looks up an appropriate Angular module + AngularJS, has code in each controller that looks up an appropriate Angular module and registers the controller with that module. The first argument is the controller name. The second argument defines the string names of @@ -666,9 +668,9 @@ table(width="100%") td :marked ### Component Decorator - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.ts', 'component')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.ts', 'component')(format=".") :marked - Angular 2, adds a decorator to the component class to provide any required metadata. + Angular, adds a decorator to the component class to provide any required metadata. The Component decorator declares that the class is a component and provides metadata about that component such as its selector (or tag) and its template. @@ -683,15 +685,15 @@ table(width="100%") function MovieListCtrl(movieService) { } :marked - In Angular 1, you write the code for the model and methods in a controller function. + In AngularJS, you write the code for the model and methods in a controller function. td :marked ### Component class - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.ts', 'class')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.ts', 'class')(format=".") :marked - In Angular 2, you create a component class. + In Angular, you create a component class. - NOTE: If you are using TypeScript with Angular 1, you must use the `export` keyword to export the component class. + NOTE: If you are using TypeScript with AngularJS, you must use the `export` keyword to export the component class. For more information, see the [Components](../guide/architecture.html#components) section of the Architecture Overview page. tr(style=top) @@ -703,7 +705,7 @@ table(width="100%") function MovieListCtrl(movieService) { } :marked - In Angular 1, you pass in any dependencies as controller function arguments. + In AngularJS, you pass in any dependencies as controller function arguments. This example injects a `MovieService`. To guard against minification problems, tell Angular explicitly @@ -711,9 +713,9 @@ table(width="100%") td :marked ### Dependency injection - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.ts', 'di')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.ts', 'di')(format=".") :marked - In Angular 2, you pass in dependencies as arguments to the component class constructor. + In Angular, you pass in dependencies as arguments to the component class constructor. This example injects a `MovieService`. The first parameter's TypeScript type tells Angular what to inject, even after minification. @@ -726,17 +728,17 @@ a(id="style-sheets") :marked ## Style sheets Style sheets give your application a nice look. - In Angular 1, you specify the style sheets for your entire application. + In AngularJS, you specify the style sheets for your entire application. As the application grows over time, the styles for the many parts of the application merge, which can cause unexpected results. - In Angular 2, you can still define style sheets for your entire application. But now you can + In Angular, you can still define style sheets for your entire application. But now you can also encapsulate a style sheet within a specific component. table(width="100%") col(width="50%") col(width="50%") tr - th Angular 1 - th Angular 2 + th AngularJS + th Angular tr(style=top) td :marked @@ -744,20 +746,20 @@ table(width="100%") code-example. <link href="styles.css" rel="stylesheet" /> :marked - Angular 1, uses a `link` tag in the head section of the `index.html` file + AngularJS, uses a `link` tag in the head section of the `index.html` file to define the styles for the application. td :marked ### Link tag - +makeExample('cb-a1-a2-quick-reference/ts/index.html', 'style')(format=".") + +makeExample('cb-ajs-quick-reference/ts/index.html', 'style')(format=".") :marked - In Angular 2, you can continue to use the link tag to define the styles for your application in the `index.html` file. + In Angular, you can continue to use the link tag to define the styles for your application in the `index.html` file. But now you can also encapsulate styles for your components. :marked ### StyleUrls - In Angular 2, you can use the `styles` or `styleUrls` property of the `@Component` metadata to define + In Angular, you can use the `styles` or `styleUrls` property of the `@Component` metadata to define a style sheet for a particular component. - +makeExample('cb-a1-a2-quick-reference/ts/app/movie-list.component.ts', 'style-url')(format=".") + +makeExample('cb-ajs-quick-reference/ts/app/movie-list.component.ts', 'style-url')(format=".") :marked This allows you to set appropriate styles for individual components that won’t leak into other parts of the application. diff --git a/public/docs/ts/latest/cookbook/ts-to-js.jade b/public/docs/ts/latest/cookbook/ts-to-js.jade index a31ec9c837..7f9cf9dac0 100644 --- a/public/docs/ts/latest/cookbook/ts-to-js.jade +++ b/public/docs/ts/latest/cookbook/ts-to-js.jade @@ -441,7 +441,7 @@ a#io-decorators When writing with _ES5 DSL_, set the `Class.constructor` property to an array whose first parameters are the injectable constructor functions and whose last parameter is the class constructor itself. - This format should be familiar to Angular 1 developers. + This format should be familiar to AngularJS developers. +makeTabs(` cb-ts-to-js/ts/app/hero-di.component.ts, diff --git a/public/docs/ts/latest/cookbook/visual-studio-2015.jade b/public/docs/ts/latest/cookbook/visual-studio-2015.jade index 0359c626a6..c450e89cc2 100644 --- a/public/docs/ts/latest/cookbook/visual-studio-2015.jade +++ b/public/docs/ts/latest/cookbook/visual-studio-2015.jade @@ -21,7 +21,7 @@ include ../_util-fns :marked If you prefer a `File | New Project` experience and are using **ASP.NET Core**, then consider the _experimental_ - ASP.NET Core + Angular 2 template for Visual Studio 2015. + ASP.NET Core + Angular template for Visual Studio 2015. Note that the resulting code does not map to the docs. Adjust accordingly. :marked @@ -51,7 +51,7 @@ h2#prereq1 Prerequisite: Node.js .l-main-section h2#prereq2 Prerequisite: Visual Studio 2015 Update 3 :marked - The minimum requirement for developing Angular 2 applications with Visual Studio is Update 3. + The minimum requirement for developing Angular applications with Visual Studio is Update 3. Earlier versions do not follow the best practices for developing applications with TypeScript. To view your version of Visual Studio 2015, go to `Help | About Visual Studio`. @@ -78,7 +78,7 @@ h2#prereq3 Prerequisite: Configure External Web tools h2#prereq4 Prerequisite: Install TypeScript 2 for Visual Studio 2015 :marked While Visual Studio Update 3 ships with TypeScript support out of the box, it currently doesn’t ship with TypeScript 2, - which you need to develop Angular 2 applications. + which you need to develop Angular applications. To install TypeScript 2: * Download and install **[TypeScript 2.0 for Visual Studio 2015](http://download.microsoft.com/download/6/D/8/6D8381B0-03C1-4BD2-AE65-30FF0A4C62DA/TS2.0.3-TS-release20-nightly-20160921.1/TypeScript_Dev14Full.exe)** diff --git a/public/docs/ts/latest/guide/_data.json b/public/docs/ts/latest/guide/_data.json index 6b9677117a..afa8ff2fb3 100644 --- a/public/docs/ts/latest/guide/_data.json +++ b/public/docs/ts/latest/guide/_data.json @@ -184,8 +184,8 @@ }, "upgrade": { - "title": "Upgrading from 1.x", - "intro": "Incrementally upgrade an Angular 1 application to Angular 2." + "title": "Upgrading to Angular", + "intro": "Incrementally upgrade an AngularJS application to Angular." }, "webpack": { diff --git a/public/docs/ts/latest/guide/change-log.jade b/public/docs/ts/latest/guide/change-log.jade index 839572a5cd..9bf11d35fb 100644 --- a/public/docs/ts/latest/guide/change-log.jade +++ b/public/docs/ts/latest/guide/change-log.jade @@ -53,7 +53,7 @@ block includes The updated [NgUpgrade Guide](upgrade.html) guide covers the new AOT friendly `upgrade/static` module released in v.2.2.0, which is the recommended - facility for migrating from Angular 1 to Angular 2. + facility for migrating from AngularJS to Angular. The documentation for the version prior to v.2.2.0 has been removed. ## ES6 described in "TypeScript to JavaScript" (2016-11-14) @@ -70,9 +70,9 @@ block includes from npm `@types` packages rather than with the _typings_ tooling. The `typings.json` file is gone. - The "[Angular 1 Upgrade](upgrade.html)" guide reflects this change. + The "[AngularJS Upgrade](upgrade.html)" guide reflects this change. The `package.json` installs `@types/angular` and several `@types/angular-...` - packages in support of upgrade; these are not needed for pure Angular 2 development. + packages in support of upgrade; these are not needed for pure Angular development. ## "Template Syntax" explains two-way data binding syntax (2016-10-20) Demonstrates how to two-way data bind to a custom Angular component and diff --git a/public/docs/ts/latest/guide/lifecycle-hooks.jade b/public/docs/ts/latest/guide/lifecycle-hooks.jade index 00283d1b6d..3fe6b411e8 100644 --- a/public/docs/ts/latest/guide/lifecycle-hooks.jade +++ b/public/docs/ts/latest/guide/lifecycle-hooks.jade @@ -490,7 +490,7 @@ figure.image-display .l-sub-section :marked - Angular 1 developers know this technique as *transclusion*. + AngularJS developers know this technique as *transclusion*. :marked Consider this variation on the [previous _AfterView_](#afterview) example. diff --git a/public/docs/ts/latest/guide/npm-packages.jade b/public/docs/ts/latest/guide/npm-packages.jade index 8868a24f40..605b878d52 100644 --- a/public/docs/ts/latest/guide/npm-packages.jade +++ b/public/docs/ts/latest/guide/npm-packages.jade @@ -81,7 +81,7 @@ a(id="dependencies") ***@angular/router*** - Component router. - ***@angular/upgrade*** - Set of utilities for upgrading Angular 1 applications. + ***@angular/upgrade*** - Set of utilities for upgrading AngularJS applications to Angular. ***[system.js](https://github.com/systemjs/systemjs)*** - A dynamic module loader compatible with the [ES2015 module](http://www.2ality.com/2014/09/es6-modules-final.html) specification. diff --git a/public/docs/ts/latest/guide/pipes.jade b/public/docs/ts/latest/guide/pipes.jade index 3cd9d66f9f..f729c010f7 100644 --- a/public/docs/ts/latest/guide/pipes.jade +++ b/public/docs/ts/latest/guide/pipes.jade @@ -446,10 +446,10 @@ a(id="no-filter-pipe") ## No *FilterPipe* or *OrderByPipe* Angular does not ship with pipes for filtering or sorting lists. - Developers familiar with Angular 1 know these as `filter` and `orderBy`. - There are no equivalents in Angular 2. + Developers familiar with AngularJS know these as `filter` and `orderBy`. + There are no equivalents in Angular. - This is not an oversight. Angular 2 is unlikely to offer such pipes because + This is not an oversight. Angular is unlikely to offer such pipes because (a) they perform poorly and (b) they prevent aggressive minification. Both `filter` and `orderBy` require parameters that reference object properties. We learned earlier that such pipes must be [*impure*](#pure-and-impure-pipes) and that @@ -457,8 +457,8 @@ a(id="no-filter-pipe") Filtering and especially sorting are expensive operations. The user experience can degrade severely for even moderate sized lists when Angular calls these pipe methods many times per second. - The `filter` and `orderBy` have often been abused in Angular 1 apps, leading to complaints that Angular itself is slow. - That charge is fair in the indirect sense that Angular 1 prepared this performance trap + The `filter` and `orderBy` have often been abused in AngularJS apps, leading to complaints that Angular itself is slow. + That charge is fair in the indirect sense that AngularJS prepared this performance trap by offering `filter` and `orderBy` in the first place. The minification hazard is also compelling if less obvious. Imagine a sorting pipe applied to a list of heroes. diff --git a/public/docs/ts/latest/guide/upgrade.jade b/public/docs/ts/latest/guide/upgrade.jade index e354758d51..cd9339308d 100644 --- a/public/docs/ts/latest/guide/upgrade.jade +++ b/public/docs/ts/latest/guide/upgrade.jade @@ -1,25 +1,29 @@ include ../_util-fns :marked - Having an existing Angular 1 application doesn't mean that we can't - begin enjoying everything Angular 2 has to offer. That's because Angular 2 - comes with built-in tools for migrating Angular 1 projects over to the - Angular 2 platform. + _Angular_ is the name for the Angular of today and tomorrow. + _AngularJS_ is the name for all v1.x versions of Angular. + + AngularJS apps are great. + Always consider the business case before moving to Angular. + An important part of that case is the time and effort to get there. + This guide describes the built-in tools for efficiently migrating AngularJS projects over to the + Angular platform, a piece at a time. Some applications will be easier to upgrade than others, and there are ways in which we can make it easier for ourselves. It is possible to - prepare and align Angular 1 applications with Angular 2 even before beginning + prepare and align AngularJS applications with Angular even before beginning the upgrade process. These preparation steps are all about making the code more decoupled, more maintainable, and up to speed with modern development tools. That means the preparation work will not only make the eventual upgrade - easier, but will also generally improve our Angular 1 applications. + easier, but will also generally improve our AngularJS applications. One of the keys to a successful upgrade is to do it incrementally, by running the two frameworks side by side in the same application, and - porting Angular 1 components to Angular 2 one by one. This makes it possible + porting AngularJS components to Angular one by one. This makes it possible to upgrade even large and complex applications without disrupting other business, because the work can be done collaboratively and spread over - a period of time. The `upgrade` module in Angular 2 has been designed to + a period of time. The `upgrade` module in Angular has been designed to make incremental upgrading seamless. 1. [Preparation](#preparation) @@ -29,50 +33,50 @@ include ../_util-fns 4. [Using Component Directives](#using-component-directives) 2. [Upgrading with The Upgrade Module](#upgrading-with-the-upgrade-module) 1. [How The Upgrade Module Works](#how-the-upgrade-module-works) - 2. [Bootstrapping hybrid Angular 1+2 Applications](#bootstrapping-hybrid-angular-1-2-applications) - 3. [Using Angular 2 Components from Angular 1 Code](#using-angular-2-components-from-angular-1-code) - 4. [Using Angular 1 Component Directives from Angular 2 Code](#using-angular-1-component-directives-from-angular-2-code) - 5. [Projecting Angular 1 Content into Angular 2 Components](#projecting-angular-1-content-into-angular-2-components) - 6. [Transcluding Angular 2 Content into Angular 1 Component Directives](#transcluding-angular-2-content-into-angular-1-component-directives) - 7. [Making Angular 1 Dependencies Injectable to Angular 2](#making-angular-1-dependencies-injectable-to-angular-2) - 8. [Making Angular 2 Dependencies Injectable to Angular 1](#making-angular-2-dependencies-injectable-to-angular-1) + 2. [Bootstrapping hybrid applications](#bootstrapping-hybrid-applications) + 3. [Using Angular Components from AngularJS Code](#using-angular-components-from-angularjs-code) + 4. [Using AngularJS Component Directives from Angular Code](#using-angularjs-component-directives-from-angular-components-from-angularjs-code) + 5. [Projecting AngularJS Content into Angular Components](#projecting-angularjs-content-into-angular-components) + 6. [Transcluding Angular Content into AngularJS Component Directives](#transcluding-angular-content-into-angularjs-component-directives) + 7. [Making AngularJS Dependencies Injectable to Angular](#making-angularjs-dependencies-injectable-to-angular) + 8. [Making Angular Dependencies Injectable to AngularJS](#making-angular-dependencies-injectable-to-angularjs) 3. [PhoneCat Upgrade Tutorial](#phonecat-upgrade-tutorial) 1. [Switching to TypeScript](#switching-to-typescript) - 2. [Installing Angular 2](#installing-angular-2) - 3. [Bootstrapping a hybrid 1+2 PhoneCat](#bootstrapping-a-hybrid-1-2-phonecat) + 2. [Installing Angular](#installing-angular) + 3. [Bootstrapping a hybrid PhoneCat](#bootstrapping-a-hybrid-phonecat) 4. [Upgrading the Phone service](#upgrading-the-phone-service) 5. [Upgrading Components](#upgrading-components) - 6. [Switching To The Angular 2 Router And Bootstrap](#switching-to-the-angular-2-router-and-bootstrap) - 7. [Saying Goodbye to Angular 1](#saying-goodbye-to-angular-1) + 6. [Switching To The Angular Router And Bootstrap](#switching-to-the-angular-router-and-bootstrap) + 7. [Saying Goodbye to AngularJS](#saying-goodbye-to-angularjs) 3. [Appendix: Upgrading PhoneCat Tests](#appendix-upgrading-phonecat-tests) .l-main-section :marked ## Preparation - There are many ways to structure Angular 1 applications. When we begin - to upgrade these applications to Angular 2, some will turn out to be + There are many ways to structure AngularJS applications. When we begin + to upgrade these applications to Angular, some will turn out to be much more easy to work with than others. There are a few key techniques and patterns that we can apply to future proof our apps even before we begin the migration. ### Follow the Angular Style Guide - The [Angular 1 Style Guide](https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#single-responsibility) + The [AngularJS Style Guide](https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#single-responsibility) collects patterns and practices that have been proven to result in - cleaner and more maintainable Angular 1 applications. It contains a wealth + cleaner and more maintainable AngularJS applications. It contains a wealth of information about how to write and organize Angular code - and equally importantly - how **not** to write and organize Angular code. - Angular 2 is a reimagined version of the best parts of Angular 1. In that + Angular is a reimagined version of the best parts of AngularJS. In that sense, its goals are the same as the Angular Style Guide's: To preserve - the good parts of Angular 1, and to avoid the bad parts. There's a lot - more to Angular 2 than just that of course, but this does mean that - *following the style guide helps make your Angular 1 app more closely - aligned with Angular 2*. + the good parts of AngularJS, and to avoid the bad parts. There's a lot + more to Angular than just that of course, but this does mean that + *following the style guide helps make your AngularJS app more closely + aligned with Angular*. There are a few rules in particular that will make it much easier to do - *an incremental upgrade* using the Angular 2 `upgrade` module: + *an incremental upgrade* using the Angular `upgrade` module: * The [Rule of 1](https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#single-responsibility) states that there should be one component per file. This not only makes @@ -115,10 +119,10 @@ include ../_util-fns :marked ### Migrating to TypeScript - If part of our Angular 2 upgrade plan is to also take TypeScript into use, it makes + If part of our Angular upgrade plan is to also take TypeScript into use, it makes sense to bring in the TypeScript compiler even before the upgrade itself begins. This means there's one less thing to learn and think about during the actual upgrade. - It also means we can start using TypeScript features in our Angular 1 code. + It also means we can start using TypeScript features in our AngularJS code. Since TypeScript is a superset of ECMAScript 2015, which in turn is a superset of ECMAScript 5, "switching" to TypeScript doesn't necessarily require anything @@ -136,28 +140,28 @@ include ../_util-fns default function parameters, and destructuring assignments can also be gradually added to make the code more expressive. * Services and controllers can be turned into *classes*. That way they'll be a step - closer to becoming Angular 2 service and component classes, which will make our + closer to becoming Angular service and component classes, which will make our life easier once we do the upgrade. ### Using Component Directives - In Angular 2, components are the main primitive from which user interfaces + In Angular, components are the main primitive from which user interfaces are built. We define the different parts of our UIs as components, and then compose the UI by using components in our templates. - You can also do this in Angular 1, using *component directives*. These are + You can also do this in AngularJS, using *component directives*. These are directives that define their own templates, controllers, and input/output bindings - - the same things that Angular 2 components define. Applications built with - component directives are much easier to migrate to Angular 2 than applications + the same things that Angular components define. Applications built with + component directives are much easier to migrate to Angular than applications built with lower-level features like `ng-controller`, `ng-include`, and scope inheritance. - To be Angular 2 compatible, an Angular 1 component directive should configure + To be Angular compatible, an AngularJS component directive should configure these attributes: * `restrict: 'E'`. Components are usually used as elements. - * `scope: {}` - an isolate scope. In Angular 2, components are always isolated - from their surroundings, and we should do this in Angular 1 too. + * `scope: {}` - an isolate scope. In Angular, components are always isolated + from their surroundings, and we should do this in AngularJS too. * `bindToController: {}`. Component inputs and outputs should be bound to the controller instead of using the `$scope`. * `controller` and `controllerAs`. Components have their own controllers. @@ -171,20 +175,20 @@ include ../_util-fns Component directives **may not** use the following attributes: - * `compile`. This will not be supported in Angular 2. - * `replace: true`. Angular 2 never replaces a component element with the - component template. This attribute is also deprecated in Angular 1. - * `priority` and `terminal`. While Angular 1 components may use these, - they are not used in Angular 2 and it is better not to write code + * `compile`. This will not be supported in Angular. + * `replace: true`. Angular never replaces a component element with the + component template. This attribute is also deprecated in AngularJS. + * `priority` and `terminal`. While AngularJS components may use these, + they are not used in Angular and it is better not to write code that relies on them. - An Angular 1 component directive that is fully aligned with the Angular 2 + An AngularJS component directive that is fully aligned with the Angular architecture may look something like this: +makeExample('upgrade-module/ts/app/hero-detail.directive.ts') :marked - Angular 1.5 introduces the [component API](https://docs.angularjs.org/api/ng/type/angular.Module) + AngularJS.5 introduces the [component API](https://docs.angularjs.org/api/ng/type/angular.Module) that makes it easier to define directives like these. It is a good idea to use this API for component directives for several reasons: @@ -199,17 +203,17 @@ include ../_util-fns :marked Controller lifecycle hook methods `$onInit()`, `$onDestroy()`, and `$onChanges()` - are another convenient feature that Angular 1.5 introduces. They all have nearly - exact [equivalents in Angular 2](lifecycle-hooks.html), so organizing component lifecycle - logic around them will ease the eventual Angular 2 upgrade process. + are another convenient feature that AngularJS.5 introduces. They all have nearly + exact [equivalents in Angular](lifecycle-hooks.html), so organizing component lifecycle + logic around them will ease the eventual Angular upgrade process. .l-main-section :marked ## Upgrading with The Upgrade Module - The `upgrade` module in Angular 2 is a very useful tool for upgrading + The `upgrade` module in Angular is a very useful tool for upgrading anything but the smallest of applications. With it we can mix and match - Angular 1 and 2 components in the same application and have them interoperate + AngularJS and 2 components in the same application and have them interoperate seamlessly. That means we don't have to do the upgrade work all at once, since there's a natural coexistence between the two frameworks during the transition period. @@ -218,11 +222,11 @@ include ../_util-fns The primary tool provided by the upgrade module is called the `UpgradeModule`. This is a service that can bootstrap and manage hybrid applications that support - both Angular 2 and Angular 1 code. + both Angular and AngularJS code. When we use `UpgradeModule`, what we're really doing is *running both versions - of Angular at the same time*. All Angular 2 code is running in the Angular 2 - framework, and Angular 1 code in the Angular 1 framework. Both of these are the + of Angular at the same time*. All Angular code is running in the Angular + framework, and AngularJS code in the AngularJS framework. Both of these are the actual, fully featured versions of the frameworks. There is no emulation going on, so we can expect to have all the features and natural behavior of both frameworks. @@ -232,14 +236,14 @@ include ../_util-fns #### Dependency Injection - Dependency injection is front and center in both Angular 1 and - Angular 2, but there are some key differences between the two + Dependency injection is front and center in both AngularJS and + Angular, but there are some key differences between the two frameworks in how it actually works. table tr - th Angular 1 - th Angular 2 + th AngularJS + th Angular tr td :marked @@ -263,16 +267,16 @@ table interoperability. The `UpgradeModule` resolves the differences and makes everything work seamlessly: - * We can make Angular 1 services available for injection to Angular 2 code + * We can make AngularJS services available for injection to Angular code by *upgrading* them. The same singleton instance of each service is shared - between the frameworks. In Angular 2 these services will always be in the + between the frameworks. In Angular these services will always be in the *root injector* and available to all components. They will always have - *string tokens* - the same tokens that they have in Angular 1. - * We can also make Angular 2 services available for injection to Angular 1 code - by *downgrading* them. Only services from the Angular 2 root injector can + *string tokens* - the same tokens that they have in AngularJS. + * We can also make Angular services available for injection to AngularJS code + by *downgrading* them. Only services from the Angular root injector can be downgraded. Again, the same singleton instances are shared between the frameworks. When we register a downgrade, we explicitly specify a *string token* that we want to - use in Angular 1. + use in AngularJS. figure.image-display img(src="/resources/images/devguide/upgrade/injectors.png" alt="The two injectors in a hybrid application" width="700") @@ -281,7 +285,7 @@ figure.image-display #### Components and the DOM What we'll find in the DOM of a hybrid application are components and - directives from both Angular 1 and Angular 2. These components + directives from both AngularJS and Angular. These components communicate with each other by using the input and output bindings of their respective frameworks, which the `UpgradeModule` bridges together. They may also communicate through shared injected dependencies, @@ -292,27 +296,27 @@ figure.image-display 1. Every element in the DOM is owned by exactly one of the two frameworks. The other framework ignores it. If an element is - owned by Angular 1, Angular 2 treats it as if it didn't exist, + owned by AngularJS, Angular treats it as if it didn't exist, and vice versa. - 2. The root of the application *is always an Angular 1 template*. + 2. The root of the application *is always an AngularJS template*. - So a hybrid application begins life as an Angular 1 application, - and it is Angular 1 that processes its root template. Angular 2 then steps - into the picture when an Angular 2 component is used somewhere in + So a hybrid application begins life as an AngularJS application, + and it is AngularJS that processes its root template. Angular then steps + into the picture when an Angular component is used somewhere in the application templates. That component's view will then be managed - by Angular 2, and it may use any number of Angular 2 components and + by Angular, and it may use any number of Angular components and directives. Beyond that, we may interleave the two frameworks as much as we need to. We always cross the boundary between the two frameworks by one of two ways: - 1. By using a component from the other framework: An Angular 1 template - using an Angular 2 component, or an Angular 2 template using an - Angular 1 component. + 1. By using a component from the other framework: An AngularJS template + using an Angular component, or an Angular template using an + AngularJS component. 2. By transcluding or projecting content from the other framework. The - `UpgradeModule` bridges the related concepts of Angular 1 transclusion - and Angular 2 content projection together. + `UpgradeModule` bridges the related concepts of AngularJS transclusion + and Angular content projection together. figure.image-display img(src="/resources/images/devguide/upgrade/dom.png" alt="DOM element ownership in a hybrid application" width="500") @@ -321,44 +325,44 @@ figure.image-display Whenever we use a component that belongs to the other framework, a switch between framework boundaries occurs. However, that switch only happens to the *children* of the component element. Consider a situation - where we use an Angular 2 component from Angular 1 like this: + where we use an Angular component from AngularJS like this: - ``` - - ``` +code-example(language="html" escape="html"). + - The DOM element `` will remain to be an Angular 1 managed - element, because it's defined in an Angular 1 template. That also - means you can apply additional Angular 1 directives to it, but *not* - Angular 2 directives. It is only in the template of the `Ng2Component` - component where Angular 2 steps in. This same rule also applies when you - use Angular 1 component directives from Angular 2. +:marked + The DOM element `` will remain to be an AngularJS managed + element, because it's defined in an AngularJS template. That also + means you can apply additional AngularJS directives to it, but *not* + Angular directives. It is only in the template of the `Ng2Component` + component where Angular steps in. This same rule also applies when you + use AngularJS component directives from Angular. :marked #### Change Detection - Change detection in Angular 1 is all about `scope.$apply()`. After every + Change detection in AngularJS is all about `scope.$apply()`. After every event that occurs, `scope.$apply()` gets called. This is done either automatically by the framework, or in some cases manually by our own code. It is the point in time when change detection occurs and data bindings get updated. - In Angular 2 things are different. While change detection still + In Angular things are different. While change detection still occurs after every event, no one needs to call `scope.$apply()` for - that to happen. This is because all Angular 2 code runs inside something + that to happen. This is because all Angular code runs inside something called the [Angular zone](../api/core/index/NgZone-class.html). Angular always knows when the code finishes, so it also knows when it should kick off change detection. The code itself doesn't have to call `scope.$apply()` or anything like it. In the case of hybrid applications, the `UpgradeModule` bridges the - Angular 1 and Angular 2 approaches. Here's what happens: + AngularJS and Angular approaches. Here's what happens: - * Everything that happens in the application runs inside the Angular 2 zone. - This is true whether the event originated in Angular 1 or Angular 2 code. - The zone triggers Angular 2 change detection after every event. - * The `UpgradeModule` will invoke the Angular 1 `$rootScope.$apply()` after - every turn of the Angular zone. This also triggers Angular 1 change + * Everything that happens in the application runs inside the Angular zone. + This is true whether the event originated in AngularJS or Angular code. + The zone triggers Angular change detection after every event. + * The `UpgradeModule` will invoke the AngularJS `$rootScope.$apply()` after + every turn of the Angular zone. This also triggers AngularJS change detection after every event. figure.image-display @@ -366,58 +370,58 @@ figure.image-display :marked What this means in practice is that we do not need to call `$apply()` in - our code, regardless of whether it is in Angular 1 on Angular 2. The + our code, regardless of whether it is in AngularJS on Angular. The `UpgradeModule` does it for us. We *can* still call `$apply()` so there is no need to remove such calls from existing code. Those calls just don't have any effect in a hybrid application. :marked - When we downgrade an Angular 2 component and then use it from Angular 1, - the component's inputs will be watched using Angular 1 change detection. + When we downgrade an Angular component and then use it from AngularJS, + the component's inputs will be watched using AngularJS change detection. When those inputs change, the corresponding properties in the component are set. We can also hook into the changes by implementing the [OnChanges](../api/core/index/OnChanges-class.html) interface in the component, just like we could if it hadn't been downgraded. - Correspondingly, when we upgrade an Angular 1 component and use it from Angular 2, + Correspondingly, when we upgrade an AngularJS component and use it from Angular, all the bindings defined for the component directive's `scope` (or `bindToController`) - will be hooked into Angular 2 change detection. They will be treated - as regular Angular 2 inputs and set onto the scope (or controller) when + will be hooked into Angular change detection. They will be treated + as regular Angular inputs and set onto the scope (or controller) when they change. - ### Using UpgradeModule with Angular 2 _NgModules_ + ### Using UpgradeModule with Angular _NgModules_ - Both Angular 1 and Angular 2 have their own concept of modules + Both AngularJS and Angular have their own concept of modules to help organize an application into cohesive blocks of functionality. Their details are quite different in architecture and implementation. - In Angular 1, you add Angular assets to the `angular.module` property. - In Angular 2, you create one or more classes adorned with an `NgModule` decorator + In AngularJS, you add Angular assets to the `angular.module` property. + In Angular, you create one or more classes adorned with an `NgModule` decorator that describes Angular assets in metadata. The differences blossom from there. In a hybrid application we run both versions of Angular at the same time. - That means that we need at least one module each from both Angular 1 and Angular 2. - We will import `UpgradeModule` inside our Angular 2 module, and then use it for - bootstrapping our Angular 1 module. Let's see how. + That means that we need at least one module each from both AngularJS and Angular. + We will import `UpgradeModule` inside our Angular module, and then use it for + bootstrapping our AngularJS module. Let's see how. .l-sub-section :marked - Learn more about Angular 2 modules at the [NgModule guide](ngmodule.html). + Learn more about Angular modules at the [NgModule guide](ngmodule.html). :marked - ### Bootstrapping Hybrid Angular 1+2 Applications + ### Bootstrapping hybrid applications The first step to upgrading an application using the `UpgradeModule` is - always to bootstrap it as a hybrid that supports both Angular 1 and - Angular 2. + always to bootstrap it as a hybrid that supports both AngularJS and + Angular. - Pure Angular 1 applications can be bootstrapped in two ways: By using an `ng-app` + Pure AngularJS applications can be bootstrapped in two ways: By using an `ng-app` directive somewhere on the HTML page, or by calling [angular.bootstrap](https://docs.angularjs.org/api/ng/function/angular.bootstrap) - from JavaScript. In Angular 2, only the second method is possible - there is - no `ng-app` in Angular 2. This is also the case for hybrid applications. - Therefore, it is a good preliminary step to switch Angular 1 applications to use the + from JavaScript. In Angular, only the second method is possible - there is + no `ng-app` in Angular. This is also the case for hybrid applications. + Therefore, it is a good preliminary step to switch AngularJS applications to use the JavaScript bootstrap method even before switching them to hybrid mode. Say we have an `ng-app` driven bootstrap such as this one: @@ -432,7 +436,7 @@ figure.image-display +makeExample('upgrade-module/ts/app/1-bootstrap/app.module.ts', 'bootstrap') :marked - Now introduce Angular 2 to the project. Inspired by instructions in + Now introduce Angular to the project. Inspired by instructions in [the Setup](setup.html), you can selectively copy in material from the QuickStart github repository. @@ -444,76 +448,76 @@ figure.image-display This bare minimum `NgModule` imports `BrowserModule`, the module every Angular browser-based app must have. It also imports `UpgradeModule` from `@angular/upgrade/static`, and adds an override to prevent - Angular 2 from bootstrapping itself in the form of the `ngDoBootstrap` empty class method. + Angular from bootstrapping itself in the form of the `ngDoBootstrap` empty class method. Now we bootstrap `AppModule` using `platformBrowserDynamic`'s `bootstrapModule` method. Then we use dependency injection to get a hold of the `UpgradeModule` instance in `AppModule`, - and use it to bootstrap our Angular 1 app. + and use it to bootstrap our AngularJS app. The `upgrade.bootstrap` method takes the exact same arguments as [angular.bootstrap](https://docs.angularjs.org/api/ng/function/angular.bootstrap): +makeExample('upgrade-module/ts/app/1-2-hybrid-bootstrap/app.module.ts', 'bootstrap') :marked - Congratulations! You're running a hybrid Angular 1+2 application! The - existing Angular 1 code works as before _and_ you're ready to run Angular 2 code. + Congratulations! You're running a hybrid application! The + existing AngularJS code works as before _and_ you're ready to run Angular code. :marked - ### Using Angular 2 Components from Angular 1 Code + ### Using Angular Components from AngularJS Code figure - img(src="/resources/images/devguide/upgrade/a1-to-a2.png" alt="Using an Angular 2 component from Angular 1 code" align="left" style="width:250px; margin-left:-40px;margin-right:10px" ) + img(src="/resources/images/devguide/upgrade/ajs-to-a.png" alt="Using an Angular component from AngularJS code" align="left" style="width:250px; margin-left:-40px;margin-right:10px" ) :marked Once we're running a hybrid app, we can start the gradual process of upgrading - code. One of the more common patterns for doing that is to use an Angular 2 component - in an Angular 1 context. This could be a completely new component or one that was - previously Angular 1 but has been rewritten for Angular 2. + code. One of the more common patterns for doing that is to use an Angular component + in an AngularJS context. This could be a completely new component or one that was + previously AngularJS but has been rewritten for Angular. - Say we have a simple Angular 2 component that shows information about a hero: + Say we have a simple Angular component that shows information about a hero: +makeExample('upgrade-module/ts/app/downgrade-static/hero-detail.component.ts', null, 'hero-detail.component.ts') :marked - If we want to use this component from Angular 1, we need to *downgrade* it - using the `downgradeComponent()` method. What we get when we do that is an Angular 1 - *directive*, which we can then register into our Angular 1 module: + If we want to use this component from AngularJS, we need to *downgrade* it + using the `downgradeComponent()` method. What we get when we do that is an AngularJS + *directive*, which we can then register into our AngularJS module: +makeExample('upgrade-module/ts/app/downgrade-static/app.module.ts', 'downgradecomponent') :marked - Because `HeroDetailComponent` is an Angular 2 component, we must also add it to the + Because `HeroDetailComponent` is an Angular component, we must also add it to the `declarations` in the `AppModule`. - And because this component is being used from the Angular 1 module, and is an entry point into - our Angular 2 application, we also need to add it to the `entryComponents` for our - Angular 2 module. + And because this component is being used from the AngularJS module, and is an entry point into + our Angular application, we also need to add it to the `entryComponents` for our + Angular module. +makeExample('upgrade-module/ts/app/downgrade-static/app.module.ts', 'ngmodule') .l-sub-section :marked - All Angular 2 components, directives and pipes must be declared in an NgModule. + All Angular components, directives and pipes must be declared in an NgModule. :marked - The net resulit is an Angular 1 directive called `heroDetail`, that we can - use like any other directive in our Angular 1 templates. + The net resulit is an AngularJS directive called `heroDetail`, that we can + use like any other directive in our AngularJS templates. +makeExample('upgrade-module/ts/index-downgrade-static.html', 'usecomponent') .alert.is-helpful :marked - Note that this Angular 1 is an element directive (`restrict: 'E'`) called `heroDetail`. - An Angular 1 element directive is matched based on its _name_. - *The `selector` metadata of the downgraded Angular 2 component is ignored.* + Note that this AngularJS is an element directive (`restrict: 'E'`) called `heroDetail`. + An AngularJS element directive is matched based on its _name_. + *The `selector` metadata of the downgraded Angular component is ignored.* :marked Most components are not quite this simple, of course. Many of them have *inputs and outputs* that connect them to the outside world. An - Angular 2 hero detail component with inputs and outputs might look + Angular hero detail component with inputs and outputs might look like this: +makeExample('upgrade-module/ts/app/downgrade-io/hero-detail.component.ts', null, 'hero-detail.component.ts') :marked - These inputs and outputs can be supplied from the Angular 1 template, and the + These inputs and outputs can be supplied from the AngularJS template, and the `downgradeComponent()` method takes care of bridging them over via the `inputs` and `outputs` arrays: @@ -521,20 +525,20 @@ figure +makeExample('upgrade-module/ts/index-downgrade-io.html', 'usecomponent') :marked - Note that even though we are in an Angular 1 template, **we're using Angular 2 + Note that even though we are in an AngularJS template, **we're using Angular attribute syntax to bind the inputs and outputs**. This is a requirement for downgraded - components. The expressions themselves are still regular Angular 1 expressions. + components. The expressions themselves are still regular AngularJS expressions. .callout.is-important header Use kebab-case for downgraded component attributes :marked - There's one notable exception to the rule of using Angular 2 attribute syntax + There's one notable exception to the rule of using Angular attribute syntax for downgraded components. It has to do with input or output names that consist - of multiple words. In Angular 2 we would bind these attributes using camelCase: + of multiple words. In Angular we would bind these attributes using camelCase: code-example(format=""). [myHero]="hero" :marked - But when using them from Angular 1 templates, we need to use kebab-case: + But when using them from AngularJS templates, we need to use kebab-case: code-example(format=""). [my-hero]="hero" @@ -543,31 +547,31 @@ figure object that was emitted. In this case it will be the `Hero` object, because that is what was passed to `this.deleted.emit()`. - Since this is an Angular 1 template, we can still use other Angular 1 - directives on the element, even though it has Angular 2 binding attributes on it. + Since this is an AngularJS template, we can still use other AngularJS + directives on the element, even though it has Angular binding attributes on it. For example, we can easily make multiple copies of the component using `ng-repeat`: +makeExample('upgrade-module/ts/index-downgrade-io.html', 'userepeatedcomponent') :marked - ### Using Angular 1 Component Directives from Angular 2 Code + ### Using AngularJS Component Directives from Angular Code figure - img(src="/resources/images/devguide/upgrade/a2-to-a1.png" alt="Using an Angular 1 component from Angular 2 code" align="left" style="width:250px; margin-left:-40px;margin-right:10px" ) + img(src="/resources/images/devguide/upgrade/a-to-ajs.png" alt="Using an AngularJS component from Angular code" align="left" style="width:250px; margin-left:-40px;margin-right:10px" ) :marked - So, we can write an Angular 2 component and then use it from Angular 1 + So, we can write an Angular component and then use it from AngularJS code. This is very useful when we start our migration from lower-level components and work our way up. But in some cases it is more convenient to do things in the opposite order: To start with higher-level components and work our way down. This too can be done using the `UpgradeModule`. - We can *upgrade* Angular 1 component directives and then use them from - Angular 2. + We can *upgrade* AngularJS component directives and then use them from + Angular. - Not all kinds of Angular 1 directives can be upgraded. The directive + Not all kinds of AngularJS directives can be upgraded. The directive really has to be a *component directive*, with the characteristics [described in the preparation guide above](#using-component-directives). Our safest bet for ensuring compatibility is using the [component API](https://docs.angularjs.org/api/ng/type/angular.Module) - introduced in Angular 1.5. + introduced in AngularJS.5. A simple example of an upgradable component is one that just has a template and a controller: @@ -575,9 +579,9 @@ figure +makeExample('upgrade-module/ts/app/upgrade-static/hero-detail.component.ts', 'hero-detail', 'hero-detail.component.ts') :marked - We can *upgrade* this component to Angular 2 using the `UpgradeComponent` class. - By creating a new Angular 2 **directive** that extends `UpgradeComponent` and doing a `super` call - inside it's constructor, we have a fully upgrade Angular 1 component to be used inside Angular 2. + We can *upgrade* this component to Angular using the `UpgradeComponent` class. + By creating a new Angular **directive** that extends `UpgradeComponent` and doing a `super` call + inside it's constructor, we have a fully upgrade AngularJS component to be used inside Angular. All that is left is to add it to `AppModule`'s `declarations` array. +makeExample('upgrade-module/ts/app/upgrade-static/hero-detail.component.ts', 'hero-detail-upgrade', 'hero-detail.component.ts') @@ -585,16 +589,16 @@ figure .alert.is-helpful :marked - Upgraded components are Angular 2 **directives**, instead of **components**, because Angular 2 - is unaware that Angular 1 will create elements under it. As far as Angular 2 knows, the upgraded - component is just a directive - a tag - and Angular 2 doesn't have to concern itself with + Upgraded components are Angular **directives**, instead of **components**, because Angular + is unaware that AngularJS will create elements under it. As far as Angular knows, the upgraded + component is just a directive - a tag - and Angular doesn't have to concern itself with it's children. :marked An upgraded component may also have inputs and outputs, as defined by - the scope/controller bindings of the original Angular 1 component - directive. When we use the component from an Angular 2 template, - we provide the inputs and outputs using **Angular 2 template syntax**, + the scope/controller bindings of the original AngularJS component + directive. When we use the component from an Angular template, + we provide the inputs and outputs using **Angular template syntax**, with the following rules: table @@ -634,61 +638,61 @@ table td :marked As a two-way binding: ``. - Since most Angular 1 two-way bindings actually only need a one-way binding + Since most AngularJS two-way bindings actually only need a one-way binding in practice, `` is often enough. :marked - As an example, say we have a hero detail Angular 1 component directive + As an example, say we have a hero detail AngularJS component directive with one input and one output: +makeExample('upgrade-module/ts/app/upgrade-io/hero-detail.component.ts', 'hero-detail-io', 'hero-detail.component.ts') :marked - We can upgrade this component to Angular 2, annotate inputs and outputs in the upgrade directive, - and then provide the input and output using Angular 2 template syntax: + We can upgrade this component to Angular, annotate inputs and outputs in the upgrade directive, + and then provide the input and output using Angular template syntax: +makeExample('upgrade-module/ts/app/upgrade-io/hero-detail.component.ts', 'hero-detail-io-upgrade', 'hero-detail.component.ts') +makeExample('upgrade-module/ts/app/upgrade-io/container.component.ts', null, 'container.component.ts') :marked - ### Projecting Angular 1 Content into Angular 2 Components + ### Projecting AngularJS Content into Angular Components figure - img(src="/resources/images/devguide/upgrade/a1-to-a2-with-projection.png" alt="Projecting Angular 1 content into Angular 2" align="left" style="width:250px; margin-left:-40px;margin-right:10px" ) + img(src="/resources/images/devguide/upgrade/ajs-to-a-with-projection.png" alt="Projecting AngularJS content into Angular" align="left" style="width:250px; margin-left:-40px;margin-right:10px" ) :marked - When we are using a downgraded Angular 2 component from an Angular 1 + When we are using a downgraded Angular component from an AngularJS template, the need may arise to *transclude* some content into it. This - is also possible. While there is no such thing as transclusion in Angular 2, + is also possible. While there is no such thing as transclusion in Angular, there is a very similar concept called *content projection*. The `UpgradeModule` is able to make these two features interoperate. - Angular 2 components that support content projection make use of an `` + Angular components that support content projection make use of an `` tag within them. Here's an example of such a component: +makeExample('upgrade-module/ts/app/1-to-2-projection/hero-detail.component.ts', null, 'hero-detail.component.ts') :marked - When using the component from Angular 1, we can supply contents for it. Just - like they would be transcluded in Angular 1, they get projected to the location - of the `` tag in Angular 2: + When using the component from AngularJS, we can supply contents for it. Just + like they would be transcluded in AngularJS, they get projected to the location + of the `` tag in Angular: +makeExample('upgrade-module/ts/index-1-to-2-projection.html', 'usecomponent') .alert.is-helpful :marked - When Angular 1 content gets projected inside an Angular 2 component, it still - remains in "Angular 1 land" and is managed by the Angular 1 framework. + When AngularJS content gets projected inside an Angular component, it still + remains in "AngularJS land" and is managed by the AngularJS framework. :marked - ### Transcluding Angular 2 Content into Angular 1 Component Directives + ### Transcluding Angular Content into AngularJS Component Directives figure - img(src="/resources/images/devguide/upgrade/a2-to-a1-with-transclusion.png" alt="Projecting Angular 2 content into Angular 1" align="left" style="width:250px; margin-left:-40px;margin-right:10px" ) + img(src="/resources/images/devguide/upgrade/a-to-ajs-with-transclusion.png" alt="Projecting Angular content into AngularJS" align="left" style="width:250px; margin-left:-40px;margin-right:10px" ) :marked - Just like we can project Angular 1 content into Angular 2 components, - we can *transclude* Angular 2 content into Angular 1 components, whenever + Just like we can project AngularJS content into Angular components, + we can *transclude* Angular content into AngularJS components, whenever we are using upgraded versions from them. - When an Angular 1 component directive supports transclusion, it may use + When an AngularJS component directive supports transclusion, it may use the `ng-transclude` directive in its template to mark the transclusion point: @@ -701,33 +705,33 @@ figure 1.5 component API. :marked - If we upgrade this component and use it from Angular 2, we can populate + If we upgrade this component and use it from Angular, we can populate the component tag with contents that will then get transcluded: +makeExample('upgrade-module/ts/app/2-to-1-transclusion/container.component.ts', null, 'container.component.ts') :marked - ### Making Angular 1 Dependencies Injectable to Angular 2 + ### Making AngularJS Dependencies Injectable to Angular When running a hybrid app, we may bump into situations where we need to have - some Angular 1 dependencies to be injected to Angular 2 code. This may be - because we have some business logic still in Angular 1 services, or because - we need some of Angular 1's built-in services like `$location` or `$timeout`. + some AngularJS dependencies to be injected to Angular code. This may be + because we have some business logic still in AngularJS services, or because + we need some of AngularJS's built-in services like `$location` or `$timeout`. - In these situations, it is possible to *upgrade* an Angular 1 provider to - Angular 2. This makes it possible to then inject it somewhere in Angular 2 - code. For example, we might have a service called `HeroesService` in Angular 1: + In these situations, it is possible to *upgrade* an AngularJS provider to + Angular. This makes it possible to then inject it somewhere in Angular + code. For example, we might have a service called `HeroesService` in AngularJS: +makeExample('upgrade-module/ts/app/1-to-2-providers/heroes.service.ts', null, 'heroes.service.ts') :marked - We can upgrade the service using a Angular 2 [Factory provider](../guide/dependency-injection.html#factory-providers) - that requests the service from the Angular 1 `$injector`. The name of the Angular 2 dependency is up to you: + We can upgrade the service using a Angular [Factory provider](../guide/dependency-injection.html#factory-providers) + that requests the service from the AngularJS `$injector`. The name of the Angular dependency is up to you: +makeExample('upgrade-module/ts/app/1-to-2-providers/app.module.ts', 'register', 'app.module.ts') :marked - We can then inject it in Angular 2 using a string token: + We can then inject it in Angular using a string token: +makeExample('upgrade-module/ts/app/1-to-2-providers/hero-detail.component.ts', null, 'hero-detail.component.ts') @@ -736,35 +740,35 @@ figure In this example we upgraded a service class, which has the added benefit that we can use a TypeScript type annotation when we inject it. While it doesn't affect how the dependency is handled, it enables the benefits of static type - checking. This is not required though, and any Angular 1 service, factory, or + checking. This is not required though, and any AngularJS service, factory, or provider can be upgraded. :marked - ### Making Angular 2 Dependencies Injectable to Angular 1 + ### Making Angular Dependencies Injectable to AngularJS - In addition to upgrading Angular 1 dependencies, we can also *downgrade* - Angular 2 dependencies, so that we can use them from Angular 1. This can be - useful when we start migrating services to Angular 2 or creating new services - in Angular 2 while we still have components written in Angular 1. + In addition to upgrading AngularJS dependencies, we can also *downgrade* + Angular dependencies, so that we can use them from AngularJS. This can be + useful when we start migrating services to Angular or creating new services + in Angular while we still have components written in AngularJS. - For example, we might have an Angular 2 service called `Heroes`: + For example, we might have an Angular service called `Heroes`: +makeExample('upgrade-module/ts/app/2-to-1-providers/heroes.ts', null, 'heroes.ts') :marked - Again, as with Angular 2 components, register the provider with the `NgModule` by adding it to the module's `providers` list. + Again, as with Angular components, register the provider with the `NgModule` by adding it to the module's `providers` list. +makeExample('upgrade-module/ts/app/2-to-1-providers/app.module.ts', 'ngmodule', 'app.module.ts') :marked - Now wrap the Angular 2 `Heroes` in an *Angular 1 factory function* using `downgradeInjectable()`. - and plug the factory into an Angular 1 module. - The name of the Angular 1 dependency is up to you: + Now wrap the Angular `Heroes` in an *AngularJS factory function* using `downgradeInjectable()`. + and plug the factory into an AngularJS module. + The name of the AngularJS dependency is up to you: +makeExample('upgrade-module/ts/app/2-to-1-providers/app.module.ts', 'register', 'app.module.ts') :marked - After this, the service is injectable anywhere in our Angular 1 code: + After this, the service is injectable anywhere in our AngularJS code: +makeExample('upgrade-module/ts/app/2-to-1-providers/hero-detail.component.ts', null, 'hero-detail.component.ts') @@ -779,13 +783,13 @@ figure In this section and we will look at a complete example of preparing and upgrading an application using the `upgrade` module. The app we're going to work on is [Angular PhoneCat](https://github.com/angular/angular-phonecat) - from [the original Angular 1 tutorial](https://docs.angularjs.org/tutorial), + from [the original AngularJS tutorial](https://docs.angularjs.org/tutorial), which is where many of us began our Angular adventures. Now we'll see how to - bring that application to the brave new world of Angular 2. + bring that application to the brave new world of Angular. During the process we'll learn how to apply the steps outlined in the [preparation guide](#preparation) in practice: We'll align the application - with Angular 2 and also take TypeScript into use. + with Angular and also take TypeScript into use. To follow along with the tutorial, clone the [angular-phonecat](https://github.com/angular/angular-phonecat) repository @@ -842,9 +846,9 @@ figure .file scenarios.js :marked - This is actually a pretty good starting point. The code uses the Angular 1.5 + This is actually a pretty good starting point. The code uses the AngularJS.5 component API and the organization follows the - [Angular 1 Style Guide](https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md), + [AngularJS Style Guide](https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md), which is an important [preparation step](#following-the-angular-style-guide) before a successful upgrade. @@ -863,7 +867,7 @@ figure :marked ### Switching to TypeScript - Since we're going to be writing our Angular 2 code in TypeScript, it makes sense to + Since we're going to be writing our Angular code in TypeScript, it makes sense to bring in the TypeScript compiler even before we begin upgrading. We will also start to gradually phase out the Bower package manager in favor @@ -883,7 +887,7 @@ code-example(format=""). :marked We can now install type definitions for the existing libraries that - we're using but that don't come with prepackaged types: Angular 1 and the + we're using but that don't come with prepackaged types: AngularJS and the Jasmine unit test framework. code-example(format=""). @@ -920,7 +924,7 @@ code-example(format=""). application in your browser. Now that we have TypeScript though, we can start benefiting from some of its - features. There's a lot of value the language can provide to Angular 1 applications. + features. There's a lot of value the language can provide to AngularJS applications. For one thing, TypeScript is a superset of ES2015. Any app that has previously been written in ES5 - like the PhoneCat example has - can with TypeScript @@ -929,8 +933,8 @@ code-example(format=""). parameters, and destructuring assignments. Another thing we can do is start adding *type safety* to our code. This has - actually partially already happened because of the Angular 1 typings we installed. - TypeScript are checking that we are calling Angular 1 APIs correctly when we do + actually partially already happened because of the AngularJS typings we installed. + TypeScript are checking that we are calling AngularJS APIs correctly when we do things like register components to Angular modules. But we can also start adding *type annotations* for our own code to get even more @@ -942,7 +946,7 @@ code-example(format=""). :marked In the `Phone` service we can explicitly annotate the `$resource` service dependency - as an `angular.resource.IResourceService` - a type defined by the Angular 1 typings. + as an `angular.resource.IResourceService` - a type defined by the AngularJS typings. +makeExample('upgrade-phonecat-1-typescript/ts/app/core/phone/phone.service.ts', null, 'app/core/phone/phone.service.ts') @@ -955,9 +959,9 @@ code-example(format=""). .l-sub-section :marked - The [Angular 1.x type definitions](https://www.npmjs.com/package/@types/angular) + The [AngularJS.x type definitions](https://www.npmjs.com/package/@types/angular) we installed are not officially maintained by the Angular team, - but are quite comprehensive. It is possible to make an Angular 1.x application + but are quite comprehensive. It is possible to make an AngularJS.x application fully type-annotated with the help of these definitions. If this is something we wanted to do, it would be a good idea to enable @@ -969,12 +973,12 @@ code-example(format=""). :marked Another TypeScript feature we can make use of is *classes*. In particular, we can turn our component controllers into classes. That way they'll be a step - closer to becoming Angular 2 component classes, which will make our life + closer to becoming Angular component classes, which will make our life easier once we do the upgrade. - Angular 1 expects controllers to be constructor functions. That's exactly what + AngularJS expects controllers to be constructor functions. That's exactly what ES2015/TypeScript classes are under the hood, so that means we can just plug in a - class as a component controller and Angular 1 will happily use it. + class as a component controller and AngularJS will happily use it. Here's what our new class for the phone list component controller looks like: @@ -999,32 +1003,32 @@ code-example(format=""). +makeExample('upgrade-phonecat-1-typescript/ts/app/phone-detail/phone-detail.component.ts', null, 'app/phone-detail/phone-detail.component.ts') :marked - This makes our controller code look a lot more like Angular 2 already. We're - all set to actually introduce Angular 2 into the project. + This makes our controller code look a lot more like Angular already. We're + all set to actually introduce Angular into the project. - If we had any Angular 1 services in the project, those would also be + If we had any AngularJS services in the project, those would also be a good candidate for converting to classes, since like controllers, they're also constructor functions. But we only have the `Phone` factory in this project, and that's a bit special since it's an `ngResource` factory. So we won't be doing anything to it in the preparation stage. - We'll instead turn it directly into an Angular 2 service. + We'll instead turn it directly into an Angular service. - ### Installing Angular 2 + ### Installing Angular - Having completed our preparation work, let's get going with the Angular 2 + Having completed our preparation work, let's get going with the Angular upgrade of PhoneCat. We'll do this incrementally with the help of the - [upgrade module](#upgrading-with-the-upgrade-module) that comes with Angular 2. - By the time we're done, we'll be able to remove Angular 1 from the project + [upgrade module](#upgrading-with-the-upgrade-module) that comes with Angular. + By the time we're done, we'll be able to remove AngularJS from the project completely, but the key is to do this piece by piece without breaking the application. .alert.is-important The project also contains some animations, which we are not yet upgrading in this version of the guide. This will change in a later release. :marked - Let's install Angular 2 into the project, along with the SystemJS module loader. + Let's install Angular into the project, along with the SystemJS module loader. Take a look at the results of the [Setup](setup.html) instructions and get the following configurations from there: - * Add Angular 2 and the other new dependencies to `package.json` + * Add Angular and the other new dependencies to `package.json` * The SystemJS configuration file `systemjs.config.js` to the project root directory. Once these are done, run: @@ -1033,7 +1037,7 @@ code-example(format=""). npm install :marked - We can soon load Angular 2 dependencies into the application via `index.html`, + We can soon load Angular dependencies into the application via `index.html`, but first we need to do some directory path adjustments. This is because we're going to need to load files from `node_modules` and the project root, whereas so far in this project everything has been loaded from the `/app` directory. @@ -1053,7 +1057,7 @@ code-example(format=""). +makeExample('upgrade-phonecat-2-hybrid/ts/index.html', 'base', 'index.html') :marked - Now we can load Angular 2 via SystemJS. We'll add the Angular 2 polyfills and the + Now we can load Angular via SystemJS. We'll add the Angular polyfills and the SystemJS config to the end of the `` section, and then we'll use `System.import` to load the actual application: @@ -1071,7 +1075,7 @@ code-example(format=""). ### Creating the _AppModule_ Now create the root `NgModule` class called `AppModule`. - There is already a file named `app.module.ts` that holds the Angular 1 module. + There is already a file named `app.module.ts` that holds the AngularJS module. Rename it to `app.module.ng1.ts` and update the corresponding script name in the `index.html` as well. The file contents remain: @@ -1083,21 +1087,21 @@ code-example(format=""). +makeExample('upgrade-phonecat-2-hybrid/ts/app/app.module.ts', 'bare', 'app.module.ts') :marked - ### Bootstrapping a hybrid 1+2 PhoneCat + ### Bootstrapping a hybrid PhoneCat What we'll do next is bootstrap the application as a *hybrid application* - that supports both Angular 1 and Angular 2 components. Once we've done that - we can start converting the individual pieces to Angular 2. + that supports both AngularJS and Angular components. Once we've done that + we can start converting the individual pieces to Angular. - To [bootstrap a hybrid application](#bootstrapping-hybrid-angular-1-2-applications), + To [bootstrap a hybrid application](#bootstrapping-hybrid-applications), we first need to import `UpgradeModule` in our `AppModule`, and override it's bootstrap method: +makeExample('upgrade-phonecat-2-hybrid/ts/app/app.module.ts', 'upgrademodule', 'app/app.module.ts') :marked - Our application is currently bootstrapped using the Angular 1 `ng-app` directive + Our application is currently bootstrapped using the AngularJS `ng-app` directive attached to the `` element of the host page. This will no longer work with - Angular 2. We should switch to a JavaScript-driven bootstrap instead. + Angular. We should switch to a JavaScript-driven bootstrap instead. So, remove the `ng-app` attribute from `index.html`, and instead bootstrap via `app/main.ts`. This file has been configured as the application entrypoint in `systemjs.config.js`, @@ -1107,13 +1111,12 @@ code-example(format=""). :marked The arguments used here are the root element of the application (which is - the same element we had `ng-app` on earlier), and the Angular 1.x modules + the same element we had `ng-app` on earlier), and the AngularJS.x modules that we want to load. Since we're bootstrapping the app through - an `UpgradeModule`, we're actually now running the app as a hybrid Angular 1+2 - app. + an `UpgradeModule`, we're actually now running the app as a **hybrid app**. - This means we are now running both Angular 1 and 2 at the same time. That's pretty - exciting! We're not running any actual Angular 2 components yet though, + This means we are now running both AngularJS and 2 at the same time. That's pretty + exciting! We're not running any actual Angular components yet though, so let's do that next. .l-sub-section @@ -1125,21 +1128,21 @@ code-example(format=""). work, once you have an ES6 `import` statement in a file all UMD typed modules must also be imported via `import` statements instead of being globally available. - Angular 1 is currently loaded by a script tag in `index.html`, which means that the whole app + AngularJS is currently loaded by a script tag in `index.html`, which means that the whole app has access to it as a global and uses the same instance of the `angular` variable. If we used `import * as angular from 'angular'` instead we would also need to overhaul how we - load every file in our Angular 1 app to use ES6 modules in order to ensure Angular 1 was being + load every file in our AngularJS app to use ES6 modules in order to ensure AngularJS was being loaded correctly. This is a considerable effort and it often isn't worth it, especially since we are in the - process of moving our our to Angular 2 already. + process of moving our our to Angular already. Instead we declare `angular` as `angular.IAngularStatic` to indicate it is a global variable and still have full typing support. :marked ### Upgrading the Phone service - The first piece we'll port over to Angular 2 is the `Phone` service, which + The first piece we'll port over to Angular is the `Phone` service, which resides in `app/core/phone/phone.service.ts` and makes it possible for components to load phone information from the server. Right now it's implemented with ngResource and we're using it for two things: @@ -1147,10 +1150,10 @@ code-example(format=""). * For loading the list of all phones into the phone list component * For loading the details of a single phone into the phone detail component. - We can replace this implementation with an Angular 2 service class, while - keeping our controllers in Angular 1 land. + We can replace this implementation with an Angular service class, while + keeping our controllers in AngularJS land. - In the new version, we import the Angular 2 HTTP module and call its `Http` service instead of `ngResource`. + In the new version, we import the Angular HTTP module and call its `Http` service instead of `ngResource`. Re-open the `app.module.ts` file, import and add `HttpModule` to the `imports` array of the `AppModule`: @@ -1164,10 +1167,10 @@ code-example(format=""). :marked The `@Injectable` decorator will attach some dependency injection metadata - to the class, letting Angular 2 know about its dependencies. As described + to the class, letting Angular know about its dependencies. As described by our [Dependency Injection Guide](../guide/dependency-injection.html), this is a marker decorator we need to use for classes that have no other - Angular 2 decorators but still need to have their dependencies injected. + Angular decorators but still need to have their dependencies injected. In its constructor the class expects to get the `Http` service. It will be injected to it and it is stored as a private field. The service is then @@ -1184,7 +1187,7 @@ code-example(format=""). :marked `@angular/upgrade/static` has a `downgradeInjectable` method for the purpose of making - Angular 2 services available to Angular 1 code. Use it to plug in the `Phone` service: + Angular services available to AngularJS code. Use it to plug in the `Phone` service: +makeExample('upgrade-phonecat-2-hybrid/ts/app/core/phone/phone.service.ts', 'downgrade-injectable', 'app/core/phone/phone.service.ts (downgrade)')(format='.') @@ -1195,11 +1198,11 @@ code-example(format=""). :marked Notice that we're importing the `map` operator of the RxJS `Observable` separately. - We need to do this for all RxJS operators that we want to use, since Angular 2 + We need to do this for all RxJS operators that we want to use, since Angular does not load all of them by default. The new `Phone` service has the same features as the original, `ngResource`-based service. - Because it's an Angular 2 service, we register it with the `NgModule` providers: + Because it's an Angular service, we register it with the `NgModule` providers: +makeExample('upgrade-phonecat-2-hybrid/ts/app/app.module.ts', 'phone', 'app.module.ts') @@ -1207,7 +1210,7 @@ code-example(format=""). Now that we are loading `phone.service.ts` through an import that is resolved by SystemJS, we should **remove the <script> tag** for the service from `index.html`. This is something we'll do to all our components as we upgrade them. Simultaneously - with the Angular 1 to 2 upgrade we're also migrating our code from scripts to modules. + with the AngularJS to 2 upgrade we're also migrating our code from scripts to modules. At this point we can switch our two components to use the new service instead of the old one. We `$inject` it as the downgraded `phone` factory, @@ -1219,10 +1222,10 @@ code-example(format=""). +makeExample('upgrade-phonecat-2-hybrid/ts/app/phone-detail/phone-detail.component.ng1.ts', null, 'app/phone-detail/phone-detail.component.ts') :marked - What we have here are two Angular 1 components using an Angular 2 service! + What we have here are two AngularJS components using an Angular service! The components don't need to be aware of this, though the fact that the service returns Observables and not Promises is a bit of a giveaway. - In any case, what we've achieved is a migration of a service to Angular 2 + In any case, what we've achieved is a migration of a service to Angular without having to yet migrate the components that use it. .alert.is-helpful @@ -1234,27 +1237,27 @@ code-example(format=""). :marked ### Upgrading Components - Next, let's upgrade our Angular 1 components to Angular 2 components. We'll + Next, let's upgrade our AngularJS components to Angular components. We'll do it one at a time, while still keeping the application in hybrid mode. - As we make these conversions, we'll also be defining our first Angular 2 *pipes*. + As we make these conversions, we'll also be defining our first Angular *pipes*. Let's look at the phone list component first. Right now it contains a TypeScript controller class and a component definition object. We can morph this into - an Angular 2 component by just renaming the controller class and turning the - Angular 1 component definition object into an Angular 2 `@Component` decorator. + an Angular component by just renaming the controller class and turning the + AngularJS component definition object into an Angular `@Component` decorator. We can then also remove the static `$inject` property from the class: +makeExample('upgrade-phonecat-2-hybrid/ts/app/phone-list/phone-list.component.ts', 'initialclass', 'app/phone-list/phone-list.component.ts') :marked The `selector` attribute is a CSS selector that defines where on the page the component - should go. In Angular 1 we do matching based on component names, but in Angular 2 we + should go. In AngularJS we do matching based on component names, but in Angular we have these explicit selectors. This one will match elements with the name `phone-list`, - just like the Angular 1 version did. + just like the AngularJS version did. - We now also need to convert the template of this component into Angular 2 syntax. - The search controls replace the Angular 1 `$ctrl` expressions - with Angular 2's two-way `[(ngModel)]` binding syntax: + We now also need to convert the template of this component into Angular syntax. + The search controls replace the AngularJS `$ctrl` expressions + with Angular's two-way `[(ngModel)]` binding syntax: +makeExample('upgrade-phonecat-2-hybrid/ts/app/phone-list/phone-list.template.html', 'controls', 'app/phone-list/phone-list.template.html (search controls)')(format='.') @@ -1266,8 +1269,8 @@ code-example(format=""). +makeExample('upgrade-phonecat-2-hybrid/ts/app/phone-list/phone-list.template.html', 'list', 'app/phone-list/phone-list.template.html (phones)')(format='.') :marked - #### No Angular 2 _filter_ or _orderBy_ filters - The built-in Angular 1 `filter` and `orderBy` filters do not exist in Angular 2, + #### No Angular _filter_ or _orderBy_ filters + The built-in AngularJS `filter` and `orderBy` filters do not exist in Angular, so we need to do the filtering and sorting ourselves. We replaced the `filter` and `orderBy` filters with bindings to the `getPhones()` controller method, @@ -1276,9 +1279,9 @@ code-example(format=""). +makeExample('upgrade-phonecat-2-hybrid/ts/app/phone-list/phone-list.component.ts', 'getphones', 'app/phone-list/phone-list.component.ts') :marked - Now we need to downgrade our Angular 2 component so we can use it in Angular 1. + Now we need to downgrade our Angular component so we can use it in AngularJS. Instead of registering a component, we register a `phoneList` *directive*, - a downgraded version of the Angular 2 component. + a downgraded version of the Angular component. The `as angular.IDirectiveFactory` cast tells the TypeScript compiler that the return value of the `downgradeComponent` method is a directive factory. @@ -1286,7 +1289,7 @@ code-example(format=""). +makeExample('upgrade-phonecat-2-hybrid/ts/app/phone-list/phone-list.component.ts', 'downgrade-component', 'app/phone-list/phone-list.component.ts') :marked - The new `PhoneListComponent` uses the Angular 2 `ngModel` directive, located in the `FormsModule`. + The new `PhoneListComponent` uses the Angular `ngModel` directive, located in the `FormsModule`. Add the `FormsModule` to `NgModule` imports, declare the new `PhoneListComponent` and finally add it to `entryComponents` since we downgraded it: @@ -1303,19 +1306,19 @@ code-example(format=""). This is similar to the phone list component. The new wrinkle is the `@Inject` decorator that identifies the `$routeParams` dependency. - The Angular 1 injector has an Angular 1 router dependency called `$routeParams`. - which was injected into `PhoneDetails` when it was still an Angular 1 controller. + The AngularJS injector has an AngularJS router dependency called `$routeParams`. + which was injected into `PhoneDetails` when it was still an AngularJS controller. We intend to inject it into the new `PhoneDetailsComponent`. - Unfortunately, Angular 1 dependencies are not automatically available to Angular 2 components. - We must use a [Factory provider](#making-angular-1-dependencies-injectable-to-angular-2) - to make `$routeParams` an Angular 2 provider. + Unfortunately, AngularJS dependencies are not automatically available to Angular components. + We must use a [Factory provider](#making-angularjs-dependencies-injectable-to-angular) + to make `$routeParams` an Angular provider. Do that in `app.module.ts`: +makeExample('upgrade-phonecat-2-hybrid/ts/app/app.module.ts', 'routeparams', 'app/app.module.ts ($routeParams)')(format='.') :marked - Convert the phone detail component template into Angular 2 syntax as follows: + Convert the phone detail component template into Angular syntax as follows: +makeExample('upgrade-phonecat-2-hybrid/ts/app/phone-detail/phone-detail.template.html', null, 'app/phone-detail/phone-detail.template.html') @@ -1325,17 +1328,17 @@ code-example(format=""). * We've removed the `$ctrl.` prefix from all expressions. * Just like we did in the phone list, we've replaced `ng-src` with property bindings for the standard `src` property. - * We're using the property binding syntax around `ng-class`. Though Angular 2 + * We're using the property binding syntax around `ng-class`. Though Angular does have [a very similar `ngClass`](../guide/template-syntax.html#directives) - as Angular 1 does, its value is not magically evaluated as an expression. - In Angular 2 we always specify in the template when an attribute's value is + as AngularJS does, its value is not magically evaluated as an expression. + In Angular we always specify in the template when an attribute's value is a property expression, as opposed to a literal string. * We've replaced `ng-repeat`s with `*ngFor`s. * We've replaced `ng-click` with an event binding for the standard `click`. * We've wrapped the whole template in an `ngIf` that causes it only to be rendered when there is a phone present. We need this because when the component first loads, we don't have `phone` yet and the expressions will refer to a - non-existing value. Unlike in Angular 1, Angular 2 expressions do not fail silently + non-existing value. Unlike in AngularJS, Angular expressions do not fail silently when we try to refer to properties on undefined objects. We need to be explicit about cases where this is expected. @@ -1348,14 +1351,14 @@ code-example(format=""). #### Add the _CheckmarkPipe_ - The Angular 1 directive had a `checkmark` _filter_. - Let's turn that into an Angular 2 **pipe**. + The AngularJS directive had a `checkmark` _filter_. + Let's turn that into an Angular **pipe**. There is no upgrade method to convert filters into pipes. You won't miss it. It's easy to turn the filter function into an equivalent Pipe class. The implementation is the same as before, repackaged in the `transform` method. - Rename the file to `checkmark.pipe.ts` to conform with Angular 2 conventions: + Rename the file to `checkmark.pipe.ts` to conform with Angular conventions: +makeExample('upgrade-phonecat-2-hybrid/ts/app/core/checkmark/checkmark.pipe.ts', null, 'app/core/checkmark/checkmark.pipe.ts')(format='.') @@ -1366,25 +1369,25 @@ code-example(format=""). +makeExample('upgrade-phonecat-2-hybrid/ts/app/app.module.ts', 'checkmarkpipe', 'app.module.ts') :marked - ### Switching To The Angular 2 Router And Bootstrap + ### Switching To The Angular Router And Bootstrap - At this point we've replaced all Angular 1 application components with - their Angular 2 counterparts. + At this point we've replaced all AngularJS application components with + their Angular counterparts. The application is still bootstrapped as a hybrid app. There's no need for that anymore. - It's time to remove the last remnants of Angular 1 in two final steps: - 1. Switch to the Angular 2 router. - 1. Bootstrap as a pure Angular 2 app. + It's time to remove the last remnants of AngularJS in two final steps: + 1. Switch to the Angular router. + 1. Bootstrap as a pure Angular app. - #### Switch to the Angular 2 router - Angular 2 has an [all-new router](router.html). + #### Switch to the Angular router + Angular has an [all-new router](router.html). Like all routers, it needs a place in the UI to display routed views. - The Angular 2 that's the `` and it belongs in a *root component* + The Angular that's the `` and it belongs in a *root component* at the top of the applications component tree. - We don't yet have such a root component, because the app is still managed as an Angular 1 app. + We don't yet have such a root component, because the app is still managed as an AngularJS app. Create a new `app.component.ts` file with the following `AppComponent` class: +makeExample('upgrade-phonecat-3-final/ts/app/app.component.ts', null, 'app/app.component.ts')(format='.') @@ -1393,19 +1396,19 @@ code-example(format=""). It has a simple template that only includes the ``. This component just renders the contents of the active route and nothing else. - The selector tells Angular 2 to plug this root component into the `` + The selector tells Angular to plug this root component into the `` element on the host web page when the application launches. Add this `` element to the `index.html`. - It replaces the old Angular 1 `ng-view` directive: + It replaces the old AngularJS `ng-view` directive: +makeExample('upgrade-phonecat-3-final/ts/index.html', 'appcomponent', 'index.html (body)')(format='.') :marked #### Create the _Routing Module_ - A router needs configuration whether it's the Angular 1 or Angular 2 or any other router. + A router needs configuration whether it's the AngularJS or Angular or any other router. - The details of Angular 2 router configuration are best left to the [Routing documentation](router.html) + The details of Angular router configuration are best left to the [Routing documentation](router.html) which recommends that you create a `NgModule` dedicated to router configuration (called a _Routing Module_): @@ -1424,7 +1427,7 @@ code-example(format=""). +makeExample('upgrade-phonecat-3-final/ts/app/app.module.ts', null, 'app/app.module.ts') :marked - The Angular 2 router passes route parameters differently. + The Angular router passes route parameters differently. Correct the `PhoneDetail` component constructor to expect an injected `ActivatedRoute` object. Extract the `phoneId` from the `ActivatedRoute.snapshot.params` and fetch the phone data as before: @@ -1442,16 +1445,16 @@ code-example(format=""). See the [Routing](router.html) page for details. :marked - #### Bootstrap as an Angular 2 app + #### Bootstrap as an Angular app You may have noticed one extra `bootstrap` metadata property added to the `AppModule` +makeExample('upgrade-phonecat-3-final/ts/app/app.module.ts', 'bootstrap', 'app/app.module.ts (bootstrap)')(format='.') :marked - That tells Angular 2 that it should bootstrap the app with the _root_ `AppComponent` and + That tells Angular that it should bootstrap the app with the _root_ `AppComponent` and insert it's view into the host web page. Now switch the bootstrap method of the application from the `UpgradeAdapter` - to the Angular 2 way. + to the Angular way. Now we can drop `upgrade.bootstrap` from our application bootstrap, and remove the `ngDoBootstrap()` override from `app.module.ts` @@ -1460,22 +1463,22 @@ code-example(format=""). +makeExample('upgrade-phonecat-3-final/ts/app/app.module.ts', null, 'app.module.ts') :marked - You are now running a pure Angular 2 application! + You are now running a pure Angular application! - ### Say Goodbye to Angular 1 + ### Say Goodbye to AngularJS It is time to take off the training wheels and let our application begin - its new life as a pure, shiny Angular 2 app. The remaining tasks all have to + its new life as a pure, shiny Angular app. The remaining tasks all have to do with removing code - which of course is every programmer's favorite task! If you haven't already, remove all references to the `UpgradeModule` from `app.module.ts`, - as well as any [Factory provider](#making-angular-1-dependencies-injectable-to-angular-2) for Angular 1 services. - Also remove any `downgradeComponent()` you find, together with the associated Angular 1 + as well as any [Factory provider](#making-angularjs-dependencies-injectable-to-angular) for AngularJS services. + Also remove any `downgradeComponent()` you find, together with the associated AngularJS directive declarations. :marked - You may also completely remove the following files. They are Angular 1 - module configuration files and not needed in Angular 2: + You may also completely remove the following files. They are AngularJS + module configuration files and not needed in Angular: * `app/app.module.ng1.ts` * `app/app.config.ts` @@ -1484,21 +1487,21 @@ code-example(format=""). * `app/phone-detail/phone-detail.module.ts` * `app/phone-list/phone-list.module.ts` - The external typings for Angular 1 may be uninstalled as well. The only ones - we still need are for Jasmine and Angular 2 polyfills. + The external typings for AngularJS may be uninstalled as well. The only ones + we still need are for Jasmine and Angular polyfills. code-example(format=""). npm uninstall @types/angular @types/angular-animate @types/angular-cookies @types/angular-mocks @types/angular-resource @types/angular-route @types/angular-sanitize --save-dev :marked Finally, from `index.html`, remove all references to - Angular 1 scripts, the Angular 2 upgrade module, and jQuery. When we're done, + AngularJS scripts, the Angular upgrade module, and jQuery. When we're done, this is what it should look like: +makeExample('upgrade-phonecat-3-final/ts/index.html', 'full', 'index.html') :marked - That is the last we'll see of Angular 1! It has served us well but now + That is the last we'll see of AngularJS! It has served us well but now it's time to say goodbye. @@ -1531,9 +1534,9 @@ code-example(format=""). ng12Hybrid: true :marked - The next set of changes is when we start to upgrade components and their template to Angular 2. - This is because the E2E tests have matchers that are specific to Angular 1. - For PhoneCat we need to make the following changes in order to make things work with Angular 2: + The next set of changes is when we start to upgrade components and their template to Angular. + This is because the E2E tests have matchers that are specific to AngularJS. + For PhoneCat we need to make the following changes in order to make things work with Angular: table tr @@ -1549,7 +1552,7 @@ table `by.css('.phones .name')` td :marked - The repeater matcher relies on Angular 1 `ng-repeat` + The repeater matcher relies on AngularJS `ng-repeat` tr td :marked @@ -1559,7 +1562,7 @@ table `by.css('.phones li')` td :marked - The repeater matcher relies on Angular 1 `ng-repeat` + The repeater matcher relies on AngularJS `ng-repeat` tr td :marked @@ -1569,7 +1572,7 @@ table `by.css('input')` td :marked - The model matcher relies on Angular 1 `ng-model` + The model matcher relies on AngularJS `ng-model` tr td :marked @@ -1579,7 +1582,7 @@ table `by.css('select')` td :marked - The model matcher relies on Angular 1 `ng-model` + The model matcher relies on AngularJS `ng-model` tr td :marked @@ -1589,14 +1592,14 @@ table `by.css('h1')` td :marked - The binding matcher relies on Angular 1 data binding + The binding matcher relies on AngularJS data binding :marked When the bootstrap method is switched from that of `UpgradeModule` to - pure Angular 2, Angular 1 ceases to exist on the page completely. + pure Angular, AngularJS ceases to exist on the page completely. At this point we need to tell Protractor that it should not be looking for - an Angular 1 app anymore, but instead it should find *Angular 2 apps* from + an AngularJS app anymore, but instead it should find *Angular apps* from the page. Replace the `ng12Hybrid` previously added with the following in `protractor-conf.js`: @@ -1606,7 +1609,7 @@ code-example(format=""). :marked Also, there are a couple of Protractor API calls in the PhoneCat test code that - are using the Angular 1 `$location` service under the hood. As that + are using the AngularJS `$location` service under the hood. As that service is no longer there after the upgrade, we need to replace those calls with ones that use WebDriver's generic URL APIs instead. The first of these is the redirection spec: @@ -1630,19 +1633,19 @@ code-example(format=""). For instance, in the phone detail component spec we can use not only ES2015 features like arrow functions and block-scoped variables, but also type - definitions for some of the Angular 1 services we're consuming: + definitions for some of the AngularJS services we're consuming: +makeExample('upgrade-phonecat-1-typescript/ts/app/phone-detail/phone-detail.component.spec.ts', null, 'app/phone-detail/phone-detail.component.spec.ts') :marked Once we start the upgrade process and bring in SystemJS, configuration changes - are needed for Karma. We need to let SystemJS load all the new Angular 2 code, + are needed for Karma. We need to let SystemJS load all the new Angular code, which can be done with the following kind of shim file: +makeExample('upgrade-phonecat-2-hybrid/ts/karma-test-shim.1.js', null, 'karma-test-shim.js') :marked - The shim first loads the SystemJS configuration, then Angular 2's test support libraries, + The shim first loads the SystemJS configuration, then Angular's test support libraries, and then the application's spec files themselves. Karma configuration should then be changed so that it uses the application root dir @@ -1658,13 +1661,13 @@ code-example(format=""). +makeExample('upgrade-phonecat-2-hybrid/ts/karma.conf.ng1.js', 'files', 'karma.conf.js') :marked - Since the HTML templates of Angular 2 components will be loaded as well, we need to help + Since the HTML templates of Angular components will be loaded as well, we need to help Karma out a bit so that it can route them to the right paths: +makeExample('upgrade-phonecat-2-hybrid/ts/karma.conf.ng1.js', 'html', 'karma.conf.js') :marked - The unit test files themselves also need to be switched to Angular 2 when their production + The unit test files themselves also need to be switched to Angular when their production counterparts are switched. The specs for the checkmark pipe are probably the most straightforward, as the pipe has no dependencies: @@ -1672,7 +1675,7 @@ code-example(format=""). :marked The unit test for the phone service is a bit more involved. We need to switch from the mocked-out - Angular 1 `$httpBackend` to a mocked-out Angular 2 Http backend. + AngularJS `$httpBackend` to a mocked-out Angular Http backend. +makeExample('upgrade-phonecat-2-hybrid/ts/app/core/phone/phone.service.spec.ts', null, 'app/core/phone/phone.service.spec.ts') @@ -1686,9 +1689,9 @@ code-example(format=""). :marked - Finally, we need to revisit both of the component tests when we switch to the Angular 2 - router. For the details component we need to provide a mock of Angular 2 `ActivatedRoute` object - instead of using the Angular 1 `$routeParams`. + Finally, we need to revisit both of the component tests when we switch to the Angular + router. For the details component we need to provide a mock of Angular `ActivatedRoute` object + instead of using the AngularJS `$routeParams`. +makeExample('upgrade-phonecat-3-final/ts/app/phone-detail/phone-detail.component.spec.ts', 'activatedroute', 'app/phone-detail/phone-detail.component.spec.ts') diff --git a/public/docs/ts/latest/help-new.jade b/public/docs/ts/latest/help-new.jade index a786955a9b..d94c15811a 100644 --- a/public/docs/ts/latest/help-new.jade +++ b/public/docs/ts/latest/help-new.jade @@ -2,7 +2,7 @@ div(flex) p. What's your question about? select#feedback-dropdown(name="Angular Version") - option(value="Angular2") Angular 2 - option(value="Angular1") Angular 1 + option(value="Angular") Angular + option(value="AngularJS") AngularJS button#feedback-btn. Submit diff --git a/public/docs/ts/latest/index.jade b/public/docs/ts/latest/index.jade index f8d6236c90..181bd0ce31 100644 --- a/public/docs/ts/latest/index.jade +++ b/public/docs/ts/latest/index.jade @@ -42,7 +42,7 @@ li a(href="/docs/#{lang}/#{vers}/cookbook/aot-compiler.html") Ahead-of-time Compilation li - a(href="/docs/#{lang}/#{vers}/cookbook/a1-a2-quick-reference.html") Angular 1 to Angular 2 + a(href="/docs/#{lang}/#{vers}/cookbook/ajs-quick-reference.html") AngularJS to Angular li a(href="/docs/#{lang}/#{vers}/cookbook/ngmodule-faq.html") Angular Module FAQ li diff --git a/public/resources/images/devguide/upgrade/a-to-ajs-with-transclusion.png b/public/resources/images/devguide/upgrade/a-to-ajs-with-transclusion.png new file mode 100644 index 0000000000000000000000000000000000000000..cbff5ad4fbb93fe07714ddbb69e69f4e1bdce3b6 GIT binary patch literal 4532 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 literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/upgrade/a-to-ajs.png b/public/resources/images/devguide/upgrade/a-to-ajs.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee416d0bb47d5cb05295a29fd6c7b2adc86ffcc GIT binary patch literal 2451 zcmbuBYar7LAIGOuqg0F7I3rfkSut~sa>@MNqAd%NY&MLLTO3{7+R@A(C89>k+;8QU zYuPvw*=*$6aqGxYr_ouC5cY7Mm(R=R_u}{c{O)gmNq8q4Iay^{2m~T$XNx-zfouad z*%!Kf(<3ldmYWiWKTEWhY#Ib&8JeT!6up_NX&2(JJ&>51N-8QO;o%=YEuh`v;#sv; z0crk>LSr&RF!qN8iRAD`!GdN9kC$E5E=fz1xVlPOS}w)pNz~mIgLZxgSCCbs+jE&R*@p zsL$7P!Rg+ifacy$h@%)W`qb_>7IJ9P;eR|;679U>r52L0CSmuJ$lFkD?L-Uj05=4x zUMX^>2J{UM^UmhHDR)Y8;P0u$0=EUDS?7DGwWrv(RsGgGJOZI$>*t@sIpVwy=xO9eUKR31AIQn#CRfDEQy0=@T=-Hx^~DXop1|l(YC`LmrP;@pCY?yi&%B71o4qAB71^S} zw>%+%`Uq7JMhhYbYgFtySB3mulh>5_h&er!$f|or!rfg%bpLgz(8$JSmC`Od;~iD% z)W}`stt-r2wztWvVH#C1b`;bigweR7#~pKwT7hQjaox}7a>5Ee{dKfnhn-}K2m<7s zg8sXzaQI?L9JiTFl{&_%A zbMkO}>-HYLy9N1;gzEzrk$>!Pym}$KY7XbVj<~gU1DbBchIi?OXC1;skP0%w7(14x zXYj|0er`l%V!xB=2BETlnioFJ#{X@WSampM;0DmE&^4$BM~2)P8pzn5^rf3zvueS? z8NetLV1Vkh8jYt999$GA>1x=Uby9d^@QEe2zNbW|*cD8uzT@BpjL!B3g2X+v zZ*55PSq>am{t+$=;m@GL5V@(0l*ET@Q~kNOj07yI4B}i)Do~HsO}LhNMlG(LOmrXd z9vivv!tyE*9Jf<(z~e7^Fx zo+y^JB12w>wjcXR8iykq*7~(c(82O5l7b|uKyrVzBokZua*B1g{=mA?Yuge3LO+{I zjC}@6)nQ)Xz+(mr3 zF|sxIAW+1be>>d9(IVIoXJ5fu{k$!`w7F0{f%QawP%oJ33v^^5$aHxym~qM!)oVc< z%^!b=s0V;rG759BT+f%f|!@t~*6sp>#h$^&jYG~DI4RbcxVM80KYIHeYZ=YIm{ zTpU(%V6zo3 z6T*NK8y|cC>Pf)3{HSN6J3J|OErjIUA9pJjY``#=&-a|%Jdp|Gmvt*$H)ZD#rtVxE z*lQsF+56ky38C3{j4wXN|&r&WM>bp%L|@P@$6Kb z?1M*pQHi>3$ruyL{5>Uy*a~o)=xRaccNykuxV3pUf!Snp`FN)xARWtID2u@Bzb-i| z0tLG(XB1wysI;HuA zW1CJvW`2DdlXV!;(vz*joqJ+7fWKp)2)Jh*GJe#&tBZ3JkL&qLL3~X7Qy$jP*K50Q zK=9kU({C6ub~!y(kFf{*L#4<}MY2AvPd~KyoFTxQb*8hOzwQqcM*wAPlG-{EIATSr z8$3;+U)z@;Q(2VYvH(M+kHpTEw`zisi{I4W*NkgyoS&R-3;6Llzo}8;7MquuU&VC| z)R{h!rKP<5ZTHSyOD|*=Ml?DWR75CW(HK34h)P*L310uhZp9uW&SaL%dgOo5E}nT{ zX4ib_p=zXOPjJM+@W2)R*B`(w*5rg({iFm3;>~`2k#??ANvb3-BX}Jn=f3TfO=~W~ z?-i-8f8PK#J650`f=27MKeaym%e2CV2R6SXLogAFMq`;~)lK4qY+&5yM zuBK=QU~YY?gh7#F9}LsZn5WF~_#RmChqEFxlVX}DVC>{6Ep({gxPeVib^dWtq^i*s zD{$*;!G@h~17i^DSF`p8Kp><;^p&X7@;B~Yx@WSQ9{O(lcEyc}`3SwvNgsVD3O85^qFO*UM literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/upgrade/a1-to-a2-with-projection.png b/public/resources/images/devguide/upgrade/a1-to-a2-with-projection.png deleted file mode 100644 index 7ae25c36377dad50085d69b3e7d0e951932003e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7679 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 o-oK3gH(PHf(^{Ho5f;r zb8|a8JKNjab8v7}R#slPaDj`9OG-+LMx({Y$Mf^^FD)%CE-vodx38q6WO;en+uPgI z({o{AK}AL7$&)9UnVFiJninr#EG;eF+}t!UF!=oWb9;Ncv9Ym`kdU~zxWB)DNJxl= zhDKamTzPr<+qZ8E3JM}3BCM>e)Ya85U%t%A$vH7Gv9`8WR8%A>DS7JDDF_6TpP#?I zyMwY6bkVJH;J+}ymszdtfEvbDAK<;$1N&CRZ^uDQ9n@7}%3&dx@o(bCe= z0s;ajPoDhp<%_VeFo8e_4Grz<>oYYq{WY?kM?n_^<`fhZ9334sGc(iD(t^QY5L2v; zjm`M@IFU${k&(e-u`w|*U%!5R@!~~WTbr(~E-x?dxpU{BP-u5|HoldW+su~y=Ff=su@bEA(F*$tr@XE@HgoH$NbhM(PVsdiw zn>TL&0JwVfs*a8hnN05O?M+Wl$K&zZ+S+q-a~&NWc6N3O3JQ>UtTzbsizVFXoNWjP zo5|_t#X9=B^VXLuK5CVifgg5S=(RqiS_``_y`tqhd!uKygEgnkvG>CMa#_Kn6_d>H z!b~Q!tG;`ADz1Nk%(8O1#%)GEFOOjz1|UAJTGCP|`$cSGcE8Vt9=IFA%mWrfyz;XR2vy z_Vy|?<)qgWgY}-;Hdez#)q-kgw_5+0P1de*kr%a>QQJ#TH6yloPCEei60%Nj_w=QQ z$91@c&^#P4Tf3r^Xrxw~^Kl9K_Xx;5~zn(=$+M8^Be1F zJmw?HMa#=_ExU~t_Oh}f~ z9z@BNyQJ$6p1}c1&?QZ}T$H)m01Rb;U02K{sjM1JPd=|^*&sHDu#@sAQ`JW~e%0Dm zrwegtU?b}+>Dg^`ArnE6ZoYdhH@VZs(Vp1y`HK)`-waS=M^P@f!ZXU4zT!eI!EsK^ zLbzmug{p&UYF4M1y`U^~eROIpk3~tZ3Bm`Q4=XqJi^C0dNdg*K+J}z1q=G{^F@*B~ z$tFdUH1SFD*+N%)Um(Lgtt%}@boL_E+8bFmJ_-9;?+!%GN1_XB5Cq>2z12b4dS&b6 zMrS@-p2coxzP=(1nLZYg9l4vYy?s*tmRdM z@NseW`MOt7q?crP8G8JzFICM^r}^l>xWfqh;aEcHZBgNNmZ z-r2`WEiILgyE5mYbu?eV&_op;QAeaB%H9qT#)6}L(+9&^d|)wb%2wiZ%F^pV?-CEK z!5I>xwVuXUY1r-(jo)F-Cq{xX4W58G&zc)})8+Y_yU!lnMDgowzeN8o@8q4CWFuT$ zf?!B#@{@er+^Py4SF(#L1_`waC_Rt+c25oDOLy+D$T)ieJN3TjCYhldXH1g9P?P%A zL3{+M%E2-ize69{0eTvjw4^p>(q6*hcgu+>eCZ}|rO3Y*9&`Ld-8E=z(H0KxglkU% z98_F10_%%hQ$NpNx=~7NOdSaWklO2U(MCkGE96*8-4YHT&@BrO8qx@?7^d&F^5ZW` z5U8C{gNbpcUTKii&kEf;Z!)3>qRg;sevf@d=*pPq zGL*yX_~Q=5Vx|uK(#C=pAe0NS+g$NNL5C>HA`_>UEr|}zkCe+auRi{*ps@jC4k|GJ4&fg$ z_vbABkL!OmQx*PA?w=$3Z}I(anQ<&z3>B@(?vLb)T~IVJjXoKf^YOa?H?}Y;KJOm+FU}lHY5)KL diff --git a/public/resources/images/devguide/upgrade/a2-to-a1-with-transclusion.png b/public/resources/images/devguide/upgrade/a2-to-a1-with-transclusion.png deleted file mode 100644 index af362a6278d7f4725755b0fa7d5bd1bd6876ca8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7773 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 diff --git a/public/resources/images/devguide/upgrade/a2-to-a1.png b/public/resources/images/devguide/upgrade/a2-to-a1.png deleted file mode 100644 index 57350dccff6d539fd19d6916728025e54268e059..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2559 zcmdT_X*3(?8V;eO)^6!kN_ASL))32d)Yc(LBDSEkVyQLM*i~p0z0xbSMl4knrAn)+ z5^hUFn_5BFw>! z$jHdd%-q@8v9`9}Z+ZFh<-)?k!-o$O6B7di1D&0nBO)RS3JO|UT9%fU`uh6FWHN`t z5f&D9adD}ut1~k*6A}`Vlar%RD2|Sf0s;c5si|UOV&A@fTU%T6^Yioc^yG56L?ZFc zn>V|=yQ{0K2M-=pS6447DKR!So}8T2(a||`=1hEi{KUjWVPRo+cQ*_Mi;9ZU*49o* zNvW-^ZEI_*tgMWSi?gw@xpe7LadEMfl$4g1*0pQbfI#5v?5u=@L`6jfpUo10ZtRbVi9YisN1(WB|<>91bBN={A=3k%!c-X0wtb#rq&bm$NW1cE>yCr+Gj zcXwy8Sh=~mf`WpUmX=5)(%;{oPNz3DHPzJA%+1X`e*F0D+qZ`g9}W)>-`LnVdGaKI zK!8G_PEJnm-n~;*RSgLVX=rG`VzDR`YG`OEAt50)Hny{~lfhuPy1JH^m$$dKmz9+T z1O%KueOg09V`^&Z$dMy4F)=tC?&HUg78Vwgl9FsTn~4ZF0G$B}2p|v$U0q!zB_%W( z9j0VFGcyw!8rs;{n3R;XxVWgPsoB-lrLV6qA|j%wsMz1%KR-WjU|+6pnKRz-tVq#*_+}vz#ZZ0Duv%bDAEiHZL z&K+A@TV-YCoSdB2)>aaU|9<>tsFKD{!Rl-`>~Zi}m!v@E3UnjDqR~oK-5@Ykc+M+Db>0 z&_3b*-e9|Sw#OJ>pXiJQEBzu2 z*2Uw0vs`i|Y^kQ;dGziid^)?KnJ#DP+8YvZ9ifof##bgSc%2Q+9FJLvgcxGom z4e7iM86Pz=7E`uiB$K?pLSpChrwI~h>hc;~ugsrlKbpQrd}eK=GsDG?r#OS3J+Jx$ z$tqr{pU$>7DDa}MqSqpn2aL}Bt2HkG8+G7wuhzX<440_@AHXO8)pASuQWdYTYw}Bd zKh}j0mppLL2WItb!VO>lii@a_p9{oaJuvSS^K2y;L9%+&P&13U5^Ba9GLJ|2P8`jo zp!VvtCEsr~$iu)KGSNIC;OWb3g3419k^#|P2I@`vS)m6oCaE`H1VmFqN9;9l&VhT zL&=Q}>jBp-kaR630xmgn7SF#KMcS_GNKcOF2*PB_Py;?&wDC8>Qm6@KSvi6Qk>;ec ztci2*Qw%_Z=+xD6h)9pB|uFp++f({v$gFK=w7EW)7 z%hon#HBs2?mS}G`aG44-HbxQ03=fd(Ks(LcbyyWW}EbFL$a}5p}({+fr#k{@1gJkOMoL zz4eK+T07T$A+@onIMtL;L*Q7n7wK@Jb&82EUJJ*GPkh1khNoURqeH{%YtMZjpD!G} z%#c@9&AsyER9-0x+M)zMg{(@&iuw$Dv=8Q#*|Jm?yX6(B4EI@h3$JfBi<#WbuiZcU zymx$RfimORs;|cCSXOD9$ID+ew6h&y8BP7VjFpO?DXrDMcjTK&C7I;v!21Ak{C^|O zKLq&yNXIFi6aM$Jg=G_bPsa^76cPHR!8?g3h~Qn%c(C1NKflcfyptY5fBy&mK%4gj X6#iKVyv+SH_C1EftW2N%?w;@`JdX6$vde!t*V{I#@6$Ff`OjiDGEzlSfEm=2L}hVz`*LZujrh5etv$MogMA^b$NOD zsHmvduV2IAa4;B5`~IEQ(IF}-N`pXXnVHhk(r7fA78^@5G11l4<>cg~d3pW#@qv*4^EmpP%pI;xackH#Ied#bR&Yz8xPQ|M>A^78aJ> z-QBgdwbs^FZ*TA3-d;~n&yJ3c%F0R;6B7di17&69b`VI{|Ahi7NLa=El8Edo2y_<& zk^+GeK_EU5sKxQ-2nfW2IO5( zchKfjNiIPj{NyD;OEp}}5c8>wv9)*1Aa!ZG0)1chX>WUR(2~2*JJ}5o;L>{)wAAxp zNyqQoB)Pe{}a%^`FdLFZl}JqKp0;hVw+;*AVbP`%0LW@Ort=jhF2Lnb0CmP=)n(N1w&Z z;RfNOoBPK)kGAZXK~Ll#8LyacxHLsN_jS$saDdzq8;;TM@+2XN-mM7{$fomJN$muLxxyj_5iud@*He@`u`(8T_omIPvex(WUJ?4Q0 z-gf^p6bHv}-fZEU>(xAe6+XXxw4ZmO;C+a(Tg-`ZmQ--E`JZb#|EP8dPn7zg!7*{K zQ=MK|e*RF_cL%isq00gVXVf`;&by4|@nJ1cyM3-Ufp^CDMc&mhy4+5NiI1kw<%a{y z^-Ph2R4EVLbINA-iG<1&#)*%~%tLaN3r%YeIkhZ2dRj(TnMElV#J{=if#C+eW&Kb} z+z_#P(6hh%Qk%-RF5y(aTn@haH0jWv>2%}tO$4c=KiAW|rpxYFI_Wd^kA6vhnD@0t z!H|<6BLcmUGijS%r8MYl5!wIU#hu7Diu+TMx&W#`>~-j zN*sj&S}ypU-}9ZzhLC27Q%5iu^YtO`^Uq@t(s}_8 zd7#A4f5;QRLq;0;mQmaotYLd{$)2~hc8^kn`wEHt`LRI1CEp4($BAsQJZiV0I+qV$ zzdk0N|GJ0WYPFAlINJ7_^xeLqO5l??N=LrBDHz2(_MRvF=T(U_W!0Y3a}(~dPD@*3U&IvzLb z`zDKW*LBJIHthg`D_`eS!9&=wT~?L3oWeY-{U?-h1csVR*l5Zt zQ5kb^ceNJ7#{!P*0}f_ZrGSBwT`DKFR;rw$Kxk4u?5PSO!0*|f325v_G=S`TBWZ*{ zVMGLp$A1aJkl8Y?)gHi6}=b|lY{Fbykh zb?pDd0E(X&yPp28wiU+>@iCU$C7gkCb8UYY5)BZMte53&-YRSpxa9UYQHj9A*V5aj z&3{K!!32G@;i1Okz@8aG9Ds1!{)#LvekLWrH95vDf-=O3b}&7 zY{%}dR1V7ghi>_KHBDSJ}vfp%?2zbyIhx z{YK@=DCt^{BEInQuh^Y@?0vM)**6`2y#5Oi^`8xE?_c@2k9HIn!vJ`@6T{#>^At{9 za%w4UO|tG_%TxSa^fib1a$;$wBmvg6!)oWLOIE5omFiev>jT$NI;jpNsWaN_!O_jL zl14d%Zeo3?xdP(k17WVi<`1LcS8hXqG3Sb&rMa!g^s=C*8uDe*1IxM3 zlm05)4{1l~Yx4lopu28z+B+wAQ`+F=;ma;|H%a{MDVS0}nauDnl_E9?46G%X&`M*2=mkuQVRZShQb zxu1w%8uhf!#Z;_*y4vg=L5f~uaP1miXi$A90%Y=asFLp~N%XyqYMgAd1|*>L4e(CT zzi5sno;@gT>POpoP^DVV{*ak@x(*`cv|H9Z24k>KorlJ#u;C@;a+ix>e3PX>$45t4o)9hTUh8Y?r=+cYhq{`JO%GJ3rOu51e%r05B`)(cfD!m;Wip}X1KIYM zOKP6xF8r5$fZe&;sf#5n#6&hn-}XU|lmvP+e$xJ^-_B(kDun*DX%#smP`a60c;fc` zJk#ICeT^Tx`8f*D<*q!|tQq~L?vYwYCqybNwo6?u+Axq@)O1sE-D_$6xTYrIbqf-X*0Q$DD5+s{&VX+)Bm25?>`LP533m=9t=(Ae6c8ELSg)GuaUk?b_h z@j_4q|H0}5{(%0-3^0v|V6|{7XNK?-eaL?ZJKvsBBFCRjh)vH{e`IZ{$!dH$cd42< zNy*UOsg@&?7qS2OpY?Hd(Y~>9{;Im$U6815EEv{t7jC^`>Nm3~!DE1xDQox+#R)2K zS-{#1w1AIkN3$ZBmy1?2*z#25VCRBBl+oqP7z&adP}?lYcEe0r&m{@E53m-8KP?Tl zS(*QsR@GI6*C}^tk#diz;(9q!^5I0u`AyHWcC*P7PJbSfZT!f*fUxLqObC2k1GrgK zK7GnWs*Eyfa3ZN&80F3{xFVw|`(K{|<_cU+9Mc&TXZB@_X+ht5wf@p}4Ucx4XoF4$ zNNcyg9&f|-++jviZ$^6n!tRNux0i}6nL+oUAd+8|JYw3(ml5_D1M6f`=BKEV_}hui zLE@qQNs-1gjJt3Co4G~d7ew=;jk1UDwiJ-Q%5TcM(DUUc3dmEuKI##@myiJSV7dh}d(_FICG(Z8#@1TrW~?!eU# zV!M;3T0gQF)FjoEZdlUwCbp+2#RS|1p!2dt=V+cpYq`)14rQ9V8l;QvQFQ3dRbyHV zO#h%FMTXU;CU3i%y6WluxKCiAfqT#oFW?UM7PaNz2Eenzap93+G-r zYoXeq79ITS#)j2g30FY6=QnAh{bcQI-D~6<1;3dYPrV~EC@HmB*C}yh#gvpHc8i&q zv~Px5n5$->9I4y2xIz?nB(Co91AzNjfUFL@{{~-}D|2a{*_nU)roGMa6o$rZT0&l3 z`3F!#H=LwG_Q!Vqy!u-ShZL_N8tG)Lc|DlO2$_80%|Z)oTsX3|EU~&o9k-@LqJQqR zPuZrhkaIHIio&+7a9lyIfQI5V_wWpgk(Zp83+agIT$CjA*nS3+zm8-=U)Mg){iLK; z*0A{QHUyzM-C8eOIQj?y9BU>_Bd|4o**uy)s0H|_yoP*s(^yMm^=BkV^^JiL%`anAip^B<3lZ+8z zrEBKT3mZrevR)p{C8c{xSB{Iw>?r_%JD?e1c6t=pb04?6%NNkQsZ53jbn0VMZ?FbS z(OA&HHVa&ft0kF-Nyx@d6yX_ApM|n;{^o*ys;jl6uaKyt#h(-Q3F^c)yND#w!#=ls zD)U-h!SR0e29BTJZWui!301s7cCQ$6xWpve3TLbBwk4!<8jy|C$W^8P-scv*+6g&>xH2t>85_m(()CDmD*> z4Q&)VJ$(3jEQI-O3c-m%FINkrA0Xh+gNLdYSQt0XX zz?pNt*I3Wq*xHLu{N%vZGawHp7xtvtb2HPrHVr>WNtjYC#&>kTT~;|}K%PpH^ZM0- zn@O)cWG`_j@S^P!ZHya+?(wvV^e0=Wn_(-KSQSS&BkpGww=ZdgSfF@oae=*$cMf+J zH%`(Ny;x_D`~orquuv+S(q=*UpTqHEXW(ff?y;PTFdg|^IqYP-7RM`K@I{yfFL|0D zU}N_LoR?E4PD!R+z);LJ#jGS}SDuyK9(6#v`z&t^K%NHK!NVFR9WybJEw)(B5(10izQMz+%yJ z%9Dj8mzuVw7IMv)hgL)xdSCMR8EJJ`WVpWk-aGTX4@K)9At9~KI$0N^3ms*rGF6+F z6YS+6bB$f$Ewi*YrVfkz>WeAG*;5ZHYAUaca=%nBHsCqQ8VR0I}mo6Ai z^?OF4+aO5)6;Ca$f)ju4{G6qIU2*)6x7Tc{AE0cYZ`(`(rsfdTQslyq*{-RwS?v`8 zzMv~4u#UCIndr2#Gu+UfBMBpwVrHETj!)_}oc~GNyu?uI&4?kaF3(DQPzOHhc0VGv zVh4T-eSZ{jh15E8xG&)E>tG|iO#VuWy1%kPDy1A_rw%o7s*Md17*uJH70~B*ykr^O zy7L?{=gb}%v~{7p*v4O5|A=8VE~s^90@0{#1$3;H6Wuf!XM7_N2kLb)QOj*hs@gc} zOKwu;d9q?h6NWNe=HeA{dzIwF1|SkCCm0yX{}O5IGD!kgdmhaU;Psp_VGj|7WhDat vFPfyuKJ2y(a2rR~zQ9lfNKMcFOH?{GIQo+Ndui&~n+RlT2sdcBbrIn>M{G0CAw4VCzzX-PR0n~GcH zRMP!mOSLv+a_;shBIHog9MZjq`}z0z>-m0Pug~ZGy*}4<{r$b>=HjRzt1b(HKopz~ z6OTb462K-?p^}@5Fss3DT9TWyr-OL&Kp^yXTd%nGrVR$&ddy=z#ksMs?yA%6ZGWVeXBx&l&5#Cdt~`PJg_aj~~| zMe`eRNr{+F7aJLgsZ{ad!)AmK$e#aS*M}P3{Tm3`CExB- zLmvwGcm%4mO|&i+(-1Xvf+_-~Ols{{kL8V6)i-(I`~vC@gUUuk06#PTu{%Os`Q~f0 z*q9d%+!5BneVI$EU(~w7W1|R1Drla7UIp{QXgR_}ac#NZ0@XF$h2S_R*Lkj{0>3?2 z22CB#|M)<LWL^Vj#S`Pk^QFcqq5>@PmUJ6TGq6&DUZ zNm?a?3mL?C%-=R-MLw^hPo?o1-0RqOuifMoePv8~x~~gSeMB zgxzqCw5q@P`nPZN>wy#|N7OQkJbtAYjo@Tlo{#97H^NdnEU6ir8AU}o{y|fuzSa%K z;2Iqj5B3*I?z3m>t=9M1TYf*Dg)URATCv?%?y1@_(|`K)UwhzBMP<4vwUrGQF-NSz zq^<{sot@d((^Y$DG|};Ev=_JJSiv81K3Ynhl|k>yrR*#SOj*_^%8MQz&WRK>ydcOw zu-pBDZw~Cs-Zxjniu|ZFnW4)hV#m!Y#Jb5GeTfP4SeB8*I@6%fTo4?q?;RpgsrL-< zfJ*7TyN--Rq>5yeB@LLwYX_IHC$l9d4OkDVYx50?+jTxYQ%AK0T_zM(yMifM2J(Nt zbf4&=c2sJ5Q&pF=2bu0d%j_*62EBn6fW9_sIoT!=&H5}kB0d|HJ6 zH5hX0UHS|ePT%>xGmEUUGatKXEFXIXhCBH!3iyh~{Uv6bILKiG6k~jGD-S^Vor5oY zL0n*-M1&2CQutQR=gkg47kM)~zY%AzPKh3Q z9IbDHm%LUPQE=mdUt9FpNx9kIU?}U^J1=<{Ir~?cT9+(Kqw8YtZlA9lV!{Z1ozu9| z9>`HWjD+{7vz^S@kDMBEU1#W7ofWp}l!^P?CGWK=|EQtQnL_EEvZ!vhQ``7PX=r)_ zqVi*;G_L7B2==f}H}8mf1J(KE%hTV@CL*8kA4(m#4oNhz%p#=6!7H7ZiWW_3EcgZZ zzI%s&rMatSZ|kwf{&Mh~(2W~cgMOVN{}qlTrAV^I8}1Q@n+kFCKx zsSG|7{L?J-6HU$f^U$Mi-Xtg+8!ff?t>2wFLtS31opqSE=;esaLYH+;;QhBcCO}c! zO^q_?rD2nil0t?lh51Vpm3##jnS9)2Jj@TijlosYIM@?$KHCz88OcT{*u9<}9Cx(N z9Ja1h!boT*7H^zyt2yEC zOgJ9Ny5myt%WK)d?*uc%x>#o|HQ#+Z!4yNFPDTbx5of_^P{i?OWRdxqpGiAfYWE_3 z@Q_XB1no@z6r${{ES8^>A~i+=%^EzYQjU!6z#%ptdTy6t(22h586Jn8!3Lc7p}Czd zR;W)eR=iBnhCa&wx z(P4yS8J57g2Li}53{llyMRP+I#{k_}gZHi@XlD2&Q3EI;UtxhcB20hW==UmoC5g|V zPw*PR>KJoFUM(y;+<$qO@uLEC6|oJva+pRzqg*klj)BpM;0U9W#GlWf3C~MAkidGk zZsHYSTCIkp7G#kimc*TKelHTz<)f$0n>-9uXw)7^joEMyiIO=St7TM z6|Rg~i^DV-Yl&YDE`;JaJ_#06fSwsanu}(d1IcN6S;gPq3y;L0D4s68v-r=>T@E5% zO=KAe)0;1wu#P{UX!`WY{O)p72QVO#kmx<16wP(bDIa-sfpE?4MggfMS~I7p66Sg( ziKjj6HLrg%!|8cqO)&FxeCBG<@nMmb+bJfFv9?UCf(xr#FG_k6esN|S%U>CK~MMhs{X{) zgGkNGw{?Swxy41TTxCpJ@4D!!_TTq3?Mpu*rw#Ws_6y)%8szC7^~C~&MZqPQ&5`K! zv_l#!m*!)w&86+f&#obNK8KQcgr5N=Uj|@bw4+*PSEbjBC3KS8+!OEVxzy=CPE8n; zaJ)8NWMm8dfQ_c|H5_sq4UZ-X+S(N9$q99*7&48VXH|K5mSNeXDv#9dy}fwBv(` z^jEcz02FA(g|Yy6NCphZ*+dkmzJ>7pTWA)!g&}=g$bGnl8SejMz=YLSvbdq~Pt4l3 YZk6L0#q+h;{9r+x99)Psgy6LQ03;NK=Kufz literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/upgrade/change_detection.png b/public/resources/images/devguide/upgrade/change_detection.png index 02d09da731f24f6c253fa310278201d20ef4c3e2..269118d81ab7767ebdf4d7d1fca300b069ac4d0f 100644 GIT binary patch literal 10664 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 diff --git a/public/resources/images/devguide/upgrade/dom.png b/public/resources/images/devguide/upgrade/dom.png index c75f858eedf64f8122bab8480699f9f8b648530e..21d2e8a8cad8eea8e6640b9e951dfafa6aac7327 100644 GIT binary patch literal 7941 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 literal 41965 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 diff --git a/tools/doc-shredder/_test/test_source/multiregion/mainBlankDocPlaster.ts b/tools/doc-shredder/_test/test_source/multiregion/mainBlankDocPlaster.ts index 6d51f851ab..be9dbd5d26 100644 --- a/tools/doc-shredder/_test/test_source/multiregion/mainBlankDocPlaster.ts +++ b/tools/doc-shredder/_test/test_source/multiregion/mainBlankDocPlaster.ts @@ -8,7 +8,7 @@ import {Component, View, bootstrap} from 'angular2/angular2'; selector: 'my-app' }) @View({ - template: '

My first Angular 2 App

' + template: '

My first Angular App

' }) class AppComponent { } @@ -20,7 +20,7 @@ class AppComponent { bootstrap(AppComponent); // #docregion twoparts -// final comment +// final comment // #enddocregion twoparts diff --git a/tools/doc-shredder/_test/test_source/no-multiregion/main.ts b/tools/doc-shredder/_test/test_source/no-multiregion/main.ts index 7a6f15ca43..71ec4f1761 100644 --- a/tools/doc-shredder/_test/test_source/no-multiregion/main.ts +++ b/tools/doc-shredder/_test/test_source/no-multiregion/main.ts @@ -7,10 +7,10 @@ import {Component, View, bootstrap} from 'angular2/angular2'; selector: 'my-app' }) @View({ - template: '

My first Angular 2 App

' + template: '

My first Angular App

' }) class AppComponent { } // #docregion bootstrap bootstrap(AppComponent); -// #enddocregion \ No newline at end of file +// #enddocregion diff --git a/tools/doc-shredder/_test/test_source/no-multiregion/nested-regions.ts b/tools/doc-shredder/_test/test_source/no-multiregion/nested-regions.ts index b8607bf62c..16df86d9d7 100644 --- a/tools/doc-shredder/_test/test_source/no-multiregion/nested-regions.ts +++ b/tools/doc-shredder/_test/test_source/no-multiregion/nested-regions.ts @@ -8,7 +8,7 @@ import {Component, View, bootstrap} from 'angular2/angular2'; selector: 'my-app' }) @View({ - template: '

My First Angular 2 App

' + template: '

My First Angular App

' }) // #docregion class class AppComponent { @@ -19,4 +19,4 @@ class AppComponent { // #docregion bootstrap bootstrap(AppComponent); // #enddocregion -// #enddocregion \ No newline at end of file +// #enddocregion