├── .gitignore
├── Chapter-01
├── 1008
│ ├── How-to-do-it
│ │ ├── app.js
│ │ └── index.html
│ └── README.md
├── 1499
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── article.component.ts
│ │ │ ├── ng1.module.ts
│ │ │ ├── ng2.module.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 2842
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── article.component.ts
│ │ │ ├── article.service.ts
│ │ │ ├── ng1.module.ts
│ │ │ ├── ng2.module.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 4137
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── ng1.module.ts
│ │ │ ├── ng2.module.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 5637
│ ├── How-to-do-it
│ │ ├── app.js
│ │ └── index.html
│ └── README.md
├── 7756
│ ├── How-to-do-it
│ │ ├── app.js
│ │ └── index.html
│ ├── README.md
│ └── There's-more
│ │ ├── app.js
│ │ └── index.html
└── 0431
│ ├── How-to-do-it
│ ├── app.js
│ └── index.html
│ └── README.md
├── Chapter-02
├── 1315
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ └── feedback.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ └── feedback.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 2048
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article-list.component.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 3211
│ ├── How-it-works
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article-list.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article-list.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 3292
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ └── click-to-reveal.directive.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 4437
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 4907
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ └── feedback.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 5094
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 6172
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── ad-section.component.ts
│ │ │ ├── app.module.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 6543
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ └── attribution.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ └── attribution.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 6577
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 7386
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ ├── feedback.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ ├── feedback.component.ts
│ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 8313
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── logo.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 8565
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
└── 8611
│ ├── How-to-do-it
│ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ └── text-editor.component.ts
│ ├── index.html
│ ├── main.ts
│ └── system-config.js
│ └── README.md
├── Chapter-03
├── 2816
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 3052
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 4076
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 5116
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 7811
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article-editor.component.ts
│ │ │ └── delay.validator.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 8574
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ ├── There's-more-(1-of-2)
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article-editor.component.ts
│ │ │ └── max-word-count.validator.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── There's-more-(2-of-2)
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article-editor.component.ts
│ │ └── max-word-count.validator.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 9302
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ └── article-editor.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
└── 0771
│ ├── How-it-works
│ ├── app
│ │ ├── app.module.ts
│ │ └── article-editor.component.ts
│ ├── index.html
│ ├── main.ts
│ └── system-config.js
│ ├── How-to-do-it
│ ├── app
│ │ ├── app.module.ts
│ │ └── article-editor.component.ts
│ ├── index.html
│ ├── main.ts
│ └── system-config.js
│ ├── README.md
│ └── There's-more
│ ├── app
│ ├── app.module.ts
│ └── article-editor.component.ts
│ ├── index.html
│ ├── main.ts
│ └── system-config.js
├── Chapter-04
├── 4362
│ ├── How-to-do-it
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 5195
│ ├── How-to-do-it-(1-of-2)
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── How-to-do-it-(2-of-2)
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 5244
│ ├── How-to-do-it
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 6828
│ ├── How-to-do-it
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 8496
│ ├── How-to-do-it
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 9315
│ ├── How-to-do-it
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
└── 0905
│ ├── How-to-do-it
│ ├── app
│ │ ├── app.module.ts
│ │ └── article.component.ts
│ ├── index.html
│ ├── main.ts
│ └── system-config.js
│ └── README.md
├── Chapter-05
├── 2417
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── node.component.ts
│ │ │ ├── publish-subscribe.service.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 4112
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── inner.component.ts
│ │ │ └── outer.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 4121
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ │ └── article.json
│ │ └── system-config.js
│ └── README.md
├── 4839
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── click-observer.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ ├── There's-more
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── click-observer.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── There's-more:-Native-RxJS-Implementation
│ │ ├── app
│ │ ├── app.module.ts
│ │ └── click-observer.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 6957
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── authentication.service.ts
│ │ │ └── login.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── authentication.service.ts
│ │ └── login.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
└── 8629
│ ├── How-to-do-it
│ ├── app
│ │ ├── api.service.ts
│ │ ├── app.module.ts
│ │ └── search.component.ts
│ ├── index.html
│ ├── main.ts
│ ├── static
│ │ └── response.json
│ └── system-config.js
│ └── README.md
├── Chapter-06
├── 1355
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ ├── default.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ │ └── response.json
│ │ └── system-config.js
│ └── README.md
├── 3308
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ ├── default.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ │ └── response.json
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ ├── default.component.ts
│ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ └── response.json
│ │ └── system-config.js
├── 4553
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article-detail.component.ts
│ │ │ ├── article-list.component.ts
│ │ │ ├── article.component.ts
│ │ │ ├── default.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ │ └── response.json
│ │ └── system-config.js
│ └── README.md
├── 6135
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── auth.service.ts
│ │ │ ├── default.component.ts
│ │ │ ├── login.component.ts
│ │ │ ├── logout.component.ts
│ │ │ ├── profile.component.ts
│ │ │ ├── root.component.ts
│ │ │ └── route-guards.service.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ │ └── response.json
│ │ └── system-config.js
│ └── README.md
├── 6214
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── default.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ │ └── response.json
│ │ └── system-config.js
│ └── README.md
├── 7892
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article-detail.component.ts
│ │ │ ├── article-list.component.ts
│ │ │ ├── article.component.ts
│ │ │ ├── default.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ │ └── response.json
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article-detail.component.ts
│ │ ├── article-list.component.ts
│ │ ├── article.component.ts
│ │ ├── default.component.ts
│ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ └── response.json
│ │ └── system-config.js
├── 8004
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ ├── default.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── static
│ │ │ └── response.json
│ │ └── system-config.js
│ └── README.md
└── 9983
│ ├── How-to-do-it
│ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ ├── default.component.ts
│ │ └── root.component.ts
│ ├── index.html
│ ├── main.ts
│ ├── static
│ │ └── response.json
│ └── system-config.js
│ ├── README.md
│ └── There's-more:-Route-Order-Considerations
│ ├── app
│ ├── app.module.ts
│ ├── article.component.ts
│ ├── default.component.ts
│ └── root.component.ts
│ ├── index.html
│ ├── main.ts
│ ├── static
│ └── response.json
│ └── system-config.js
├── Chapter-07
├── 1109
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article-source.interface.ts
│ │ │ ├── article.component.ts
│ │ │ ├── article.service.ts
│ │ │ ├── default-view.component.ts
│ │ │ ├── editor-article.service.ts
│ │ │ ├── editor-view.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ ├── There's-more
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article-source.interface.ts
│ │ │ ├── article.component.ts
│ │ │ ├── article.service.ts
│ │ │ ├── default-view.component.ts
│ │ │ ├── editor-article.service.ts
│ │ │ ├── editor-view.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── There's-more:-Refactoring-with-Directive-Providers
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article-source.interface.ts
│ │ ├── article.component.ts
│ │ ├── article.service.ts
│ │ ├── default-view.component.ts
│ │ ├── editor-article.service.ts
│ │ ├── editor-view.directive.ts
│ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 2102
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ ├── article.module.ts
│ │ │ ├── article.service.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ ├── There's-more:-Integrating-Different-Services-into-Different-Components
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ ├── article.module.ts
│ │ │ ├── article.service.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── There's-more:-Service-Instantiation
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ ├── article.module.ts
│ │ ├── article.service.ts
│ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 3032
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ ├── logo-url.token.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ ├── editor-article.service.ts
│ │ ├── editor-view.directive.ts
│ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 4263
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── root.component.ts
│ │ ├── article.service.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
└── 0049
│ ├── How-to-do-it
│ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ ├── article.factory.ts
│ │ ├── article.service.ts
│ │ ├── article.token.ts
│ │ ├── default-view.directive.ts
│ │ ├── editor-view.directive.ts
│ │ └── root.component.ts
│ ├── index.html
│ ├── main.ts
│ └── system-config.js
│ └── README.md
├── Chapter-08
├── 1053
│ └── How-to-do-it
│ │ └── tsconfig.json
├── 1332
│ └── How-to-do-it
│ │ └── package.json
├── 2283
│ └── How-to-do-it
│ │ ├── article.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── package.json
├── 3310
│ └── How-to-do-it
│ │ ├── index.html
│ │ ├── package.json
│ │ └── webpack.config.js
├── 6323
│ └── How-to-do-it
│ │ └── app
│ │ ├── app.component.ts
│ │ ├── app.module.ts
│ │ ├── index.html
│ │ └── main.ts
├── 7185
│ └── How-to-do-it
│ │ ├── bs-config.json
│ │ ├── index.html
│ │ ├── package.json
│ │ └── webpack.config.js
└── 7479
│ └── How-to-do-it
│ ├── index.html
│ ├── main.ts
│ └── polyfills.ts
├── Chapter-09
├── 3107
│ ├── How-to-do-it
│ │ └── src
│ │ │ └── app
│ │ │ ├── magic-eight-ball.service.spec.ts
│ │ │ └── magic-eight-ball.service.ts
│ └── There's-more
│ │ └── src
│ │ └── app
│ │ ├── magic-eight-ball.service.spec.ts
│ │ └── magic-eight-ball.service.ts
├── 3444
│ └── How-to-do-it
│ │ └── src
│ │ └── app
│ │ └── magic-eight-ball
│ │ ├── magic-eight-ball.component.spec.ts
│ │ └── magic-eight-ball.component.ts
├── 3935
│ └── How-to-do-it
│ │ └── src
│ │ └── app
│ │ └── article
│ │ ├── article.component.spec.ts
│ │ └── article.component.ts
├── 3998
│ └── How-to-do-it
│ │ ├── karma.conf.js
│ │ ├── package.json
│ │ ├── src
│ │ ├── article.spec.ts
│ │ └── article.ts
│ │ └── tsconfig.json
├── 6651
│ └── How-to-do-it
│ │ └── src
│ │ └── app
│ │ └── magic-eight-ball
│ │ ├── magic-eight-ball.component.spec.ts
│ │ └── magic-eight-ball.component.ts
└── 8985
│ └── How-to-do-it
│ ├── app
│ ├── app.component.ts
│ ├── app.module.ts
│ └── main.ts
│ ├── e2e
│ ├── app.e2e-spec.ts
│ ├── app.po.ts
│ ├── bs-config.json
│ └── tsconfig.json
│ ├── index.html
│ ├── package.json
│ ├── protractor.conf.js
│ └── tsconfig.json
├── Chapter-10
├── 1463
│ └── How-to-do-it
│ │ └── app.component.ts
├── 1859
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ └── article.component.ts
│ │ ├── index.html
│ │ ├── loader.js
│ │ ├── main.ts
│ │ ├── system-config.js
│ │ └── web-worker-main.ts
│ └── README.md
├── 3362
│ └── How-to-do-it
│ │ └── app.component.ts
├── 4909
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ └── README.md
├── 8676
│ └── How-to-do-it
│ │ └── app.component.ts
├── 0279
│ ├── How-to-do-it
│ │ ├── app
│ │ │ ├── app.module.ts
│ │ │ ├── article.component.ts
│ │ │ ├── article.module.ts
│ │ │ ├── link.component.ts
│ │ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
│ ├── README.md
│ └── There's-more
│ │ ├── app
│ │ ├── app.module.ts
│ │ ├── article.component.ts
│ │ ├── article.module.ts
│ │ ├── auth.module.ts
│ │ ├── auth.service.ts
│ │ ├── link.component.ts
│ │ └── root.component.ts
│ │ ├── index.html
│ │ ├── main.ts
│ │ └── system-config.js
├── 0591
│ └── How-to-do-it
│ │ └── index.html
└── 0623
│ ├── How-to-do-it
│ ├── add-random.pipe.ts
│ ├── app.component.ts
│ └── main.ts
│ └── There's-more
│ └── add-random.pipe.ts
├── LICENSE
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .editorconfig
3 |
--------------------------------------------------------------------------------
/Chapter-01/0431/How-to-do-it/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/Chapter-01/0431/README.md:
--------------------------------------------------------------------------------
1 | # Componentizing Directives Using controllerAs Encapsulation
--------------------------------------------------------------------------------
/Chapter-01/1008/How-to-do-it/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
--------------------------------------------------------------------------------
/Chapter-01/1008/README.md:
--------------------------------------------------------------------------------
1 | # Migrating an Application to Component Directives
--------------------------------------------------------------------------------
/Chapter-01/1499/How-to-do-it/app/article.component.ts:
--------------------------------------------------------------------------------
1 | import {Component, Input} from '@angular/core';
2 | import {downgradeComponent} from '@angular/upgrade/static';
3 | import {Ng1AppModule} from './ng1.module';
4 |
5 | @Component({
6 | selector: 'ng2-article',
7 | template: `
8 | {{title}}
9 | Written by: {{author}}
10 | `
11 | })
12 | export class ArticleComponent {
13 | @Input() author:string
14 | title:string = 'Unicycle Jousting Recognized as Olympic Sport';
15 | }
16 |
17 | Ng1AppModule.directive(
18 | 'ng1Article',
19 | downgradeComponent({
20 | component: ArticleComponent,
21 | inputs: ['author']
22 | }));
--------------------------------------------------------------------------------
/Chapter-01/1499/How-to-do-it/app/ng1.module.ts:
--------------------------------------------------------------------------------
1 | import 'angular';
2 |
3 | export const Ng1AppModule = angular.module('Ng1AppModule', []);
--------------------------------------------------------------------------------
/Chapter-01/1499/How-to-do-it/app/root.component.ts:
--------------------------------------------------------------------------------
1 | import {Component} from '@angular/core';
2 |
3 | @Component({
4 | selector: 'root',
5 | template: ``
6 | })
7 | export class RootComponent {}
--------------------------------------------------------------------------------
/Chapter-01/1499/How-to-do-it/main.ts:
--------------------------------------------------------------------------------
1 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
2 |
3 | import {Ng1AppModule} from './app/ng1.module';
4 | import {Ng2AppModule} from './app/ng2.module';
5 |
6 | platformBrowserDynamic()
7 | .bootstrapModule(Ng2AppModule)
8 | .then(ref => {
9 | ref.instance.upgrade.bootstrap(document.body, [Ng1AppModule.name]);
10 | });
11 |
--------------------------------------------------------------------------------
/Chapter-01/1499/README.md:
--------------------------------------------------------------------------------
1 | # Downgrading Angular 2 Components to Angular 1 Directives with downgradeComponent
--------------------------------------------------------------------------------
/Chapter-01/2842/How-to-do-it/app/article.component.ts:
--------------------------------------------------------------------------------
1 | export const ng1Article = {
2 | template: `
3 | {{article.title}}
4 | {{article.author}}
5 | `,
6 | controller: (ArticleService, $scope) => {
7 | $scope.article = ArticleService.article;
8 | }
9 | };
--------------------------------------------------------------------------------
/Chapter-01/2842/How-to-do-it/app/article.service.ts:
--------------------------------------------------------------------------------
1 | import {Injectable} from '@angular/core';
2 |
3 | @Injectable()
4 | export class ArticleService {
5 | article:Object = {
6 | title: 'Research Shows Moon Not Actually Made of Cheese',
7 | author: 'Jake Hsu'
8 | };
9 | }
10 |
11 |
--------------------------------------------------------------------------------
/Chapter-01/2842/How-to-do-it/app/ng1.module.ts:
--------------------------------------------------------------------------------
1 | import 'angular';
2 | import {ng1Article} from './article.component';
3 | import {ArticleService} from './article.service';
4 | import {downgradeInjectable} from '@angular/upgrade/static';
5 |
6 | export const Ng1AppModule = angular.module('Ng1AppModule', [])
7 | .component('ng1Article', ng1Article)
8 | .factory('ArticleService', downgradeInjectable(ArticleService));
9 |
--------------------------------------------------------------------------------
/Chapter-01/2842/How-to-do-it/app/ng2.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule} from '@angular/core';
2 | import {BrowserModule} from '@angular/platform-browser';
3 | import {UpgradeModule} from '@angular/upgrade/static';
4 | import {RootComponent} from './root.component';
5 | import {ArticleService} from './article.service';
6 |
7 | @NgModule({
8 | imports: [
9 | BrowserModule,
10 | UpgradeModule,
11 | ],
12 | declarations: [
13 | RootComponent
14 | ],
15 | providers: [
16 | ArticleService
17 | ],
18 | bootstrap: [
19 | RootComponent
20 | ]
21 | })
22 | export class Ng2AppModule {
23 | constructor(public upgrade: UpgradeModule){}
24 | }
--------------------------------------------------------------------------------
/Chapter-01/2842/How-to-do-it/app/root.component.ts:
--------------------------------------------------------------------------------
1 | import {Component} from '@angular/core';
2 |
3 | @Component({
4 | selector: 'root',
5 | template: ``
6 | })
7 | export class RootComponent {}
--------------------------------------------------------------------------------
/Chapter-01/2842/How-to-do-it/main.ts:
--------------------------------------------------------------------------------
1 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
2 |
3 | import {Ng1AppModule} from './app/ng1.module';
4 | import {Ng2AppModule} from './app/ng2.module';
5 |
6 | platformBrowserDynamic()
7 | .bootstrapModule(Ng2AppModule)
8 | .then(ref => {
9 | ref.instance.upgrade.bootstrap(document.body, [Ng1AppModule.name]);
10 | });
11 |
--------------------------------------------------------------------------------
/Chapter-01/2842/README.md:
--------------------------------------------------------------------------------
1 | # Downgrade Angular 2 Providers to Angular 1 Services with downgradeInjectable
--------------------------------------------------------------------------------
/Chapter-01/4137/How-to-do-it/app/ng1.module.ts:
--------------------------------------------------------------------------------
1 | import 'angular';
2 |
3 | export const Ng1AppModule = angular.module('Ng1AppModule', []);
--------------------------------------------------------------------------------
/Chapter-01/4137/How-to-do-it/app/ng2.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule, Component} from '@angular/core';
2 | import {BrowserModule} from '@angular/platform-browser';
3 | import {UpgradeModule} from '@angular/upgrade/static';
4 | import {RootComponent} from './root.component';
5 |
6 | @NgModule({
7 | imports: [
8 | BrowserModule,
9 | UpgradeModule,
10 | ],
11 | bootstrap: [
12 | RootComponent
13 | ],
14 | declarations: [
15 | RootComponent
16 | ]
17 | })
18 | export class Ng2AppModule {
19 | constructor(public upgrade: UpgradeModule){}
20 | }
--------------------------------------------------------------------------------
/Chapter-01/4137/How-to-do-it/app/root.component.ts:
--------------------------------------------------------------------------------
1 | import {Component} from '@angular/core';
2 |
3 | @Component({
4 | selector: 'root',
5 | template: `
6 | Angular 2 bootstrapped successfully!
7 | `
8 | })
9 | export class RootComponent {}
--------------------------------------------------------------------------------
/Chapter-01/4137/How-to-do-it/main.ts:
--------------------------------------------------------------------------------
1 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
2 |
3 | import {Ng1AppModule} from './app/ng1.module';
4 | import {Ng2AppModule} from './app/ng2.module';
5 |
6 | platformBrowserDynamic()
7 | .bootstrapModule(Ng2AppModule)
8 | .then(ref => {
9 | ref.instance.upgrade.bootstrap(document.body, [Ng1AppModule.name]);
10 | });
11 |
--------------------------------------------------------------------------------
/Chapter-01/4137/README.md:
--------------------------------------------------------------------------------
1 | # Connecting Angular 1 and Angular 2 with UpgradeModule
--------------------------------------------------------------------------------
/Chapter-01/5637/How-to-do-it/app.js:
--------------------------------------------------------------------------------
1 | angular.module('articleApp', [])
2 | .service('ArticleData', function() {
3 | var title = 'Incumbent Senator Ousted by Stalk of Broccoli';
4 | this.getTitle = function() {
5 | return title;
6 | };
7 | this.author = 'Jake';
8 | })
9 | .component('article', {
10 | controller: function(ArticleData) {
11 | this.title = ArticleData.getTitle();
12 | this.author = ArticleData.author;
13 | },
14 | template: `
15 | {{ $ctrl.title }}
16 | Written by: {{ $ctrl.author }}
17 | `
18 | });
19 |
--------------------------------------------------------------------------------
/Chapter-01/5637/How-to-do-it/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/Chapter-01/5637/README.md:
--------------------------------------------------------------------------------
1 | # Normalizing Service Types
--------------------------------------------------------------------------------
/Chapter-01/7756/How-to-do-it/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/Chapter-01/7756/README.md:
--------------------------------------------------------------------------------
1 | # Implementing a Basic Component in Angular 1.5
--------------------------------------------------------------------------------
/Chapter-01/7756/There's-more/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/Chapter-02/1315/How-to-do-it/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule} from '@angular/core';
2 | import {BrowserModule} from '@angular/platform-browser';
3 | import {ArticleComponent} from './article.component';
4 | import {FeedbackComponent} from './feedback.component';
5 |
6 | @NgModule({
7 | imports: [
8 | BrowserModule
9 | ],
10 | declarations: [
11 | ArticleComponent,
12 | FeedbackComponent
13 | ],
14 | bootstrap: [
15 | ArticleComponent
16 | ]
17 | })
18 | export class AppModule {}
19 |
--------------------------------------------------------------------------------
/Chapter-02/1315/How-to-do-it/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Chapter-02/1315/How-to-do-it/main.ts:
--------------------------------------------------------------------------------
1 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
2 | import {AppModule} from './app/app.module';
3 |
4 | platformBrowserDynamic().bootstrapModule(AppModule);
5 |
--------------------------------------------------------------------------------
/Chapter-02/1315/README.md:
--------------------------------------------------------------------------------
1 | # Configuring Mutual Parent-Child Awareness with ViewChild and forwardRef
--------------------------------------------------------------------------------
/Chapter-02/1315/There's-more/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule} from '@angular/core';
2 | import {BrowserModule} from '@angular/platform-browser';
3 | import {ArticleComponent} from './article.component';
4 | import {FeedbackComponent} from './feedback.component';
5 |
6 | @NgModule({
7 | imports: [
8 | BrowserModule
9 | ],
10 | declarations: [
11 | ArticleComponent,
12 | FeedbackComponent
13 | ],
14 | bootstrap: [
15 | ArticleComponent
16 | ]
17 | })
18 | export class AppModule {}
19 |
--------------------------------------------------------------------------------
/Chapter-02/1315/There's-more/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Chapter-02/1315/There's-more/main.ts:
--------------------------------------------------------------------------------
1 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
2 | import {AppModule} from './app/app.module';
3 |
4 | platformBrowserDynamic().bootstrapModule(AppModule);
5 |
--------------------------------------------------------------------------------
/Chapter-02/2048/How-to-do-it/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule} from '@angular/core';
2 | import {BrowserModule} from '@angular/platform-browser';
3 | import {ArticleComponent} from './article.component';
4 | import {ArticleListComponent} from './article-list.component';
5 |
6 | @NgModule({
7 | imports: [
8 | BrowserModule
9 | ],
10 | declarations: [
11 | ArticleComponent,
12 | ArticleListComponent
13 | ],
14 | bootstrap: [
15 | ArticleListComponent
16 | ]
17 | })
18 | export class AppModule {}
19 |
--------------------------------------------------------------------------------
/Chapter-02/2048/How-to-do-it/app/article.component.ts:
--------------------------------------------------------------------------------
1 | import {Component, Input, ngOnInit, ngOnDestroy} from '@angular/core';
2 |
3 | @Component({
4 | selector: 'article',
5 | template: `
6 |
7 | {{articleTitle}}
8 |
9 | `
10 | })
11 | export class ArticleComponent implements OnInit, OnDestroy {
12 | @Input() articleTitle:string;
13 |
14 | ngOnInit() {
15 | console.log('created', this.articleTitle);
16 | }
17 |
18 | ngOnDestroy() {
19 | console.log('destroyed', this.articleTitle);
20 | }
21 | }
--------------------------------------------------------------------------------
/Chapter-02/2048/How-to-do-it/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Chapter-02/2048/How-to-do-it/main.ts:
--------------------------------------------------------------------------------
1 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
2 | import {AppModule} from './app/app.module';
3 |
4 | platformBrowserDynamic().bootstrapModule(AppModule);
5 |
--------------------------------------------------------------------------------
/Chapter-02/2048/README.md:
--------------------------------------------------------------------------------
1 | # Utilizing Component Lifecycle Hooks
--------------------------------------------------------------------------------
/Chapter-02/3211/How-it-works/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule} from '@angular/core';
2 | import {BrowserModule} from '@angular/platform-browser';
3 | import {ArticleListComponent} from './article-list.component';
4 |
5 |
6 | @NgModule({
7 | imports: [
8 | BrowserModule
9 | ],
10 | declarations: [
11 | ArticleListComponent
12 | ],
13 | bootstrap: [
14 | ArticleListComponent
15 | ]
16 | })
17 | export class AppModule {}
18 |
--------------------------------------------------------------------------------
/Chapter-02/3211/How-it-works/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Chapter-02/3211/How-it-works/main.ts:
--------------------------------------------------------------------------------
1 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
2 | import {AppModule} from './app/app.module';
3 |
4 | platformBrowserDynamic().bootstrapModule(AppModule);
5 |
--------------------------------------------------------------------------------
/Chapter-02/3211/How-to-do-it/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule} from '@angular/core';
2 | import {BrowserModule} from '@angular/platform-browser';
3 | import {ArticleListComponent} from './article-list.component';
4 |
5 |
6 | @NgModule({
7 | imports: [
8 | BrowserModule
9 | ],
10 | declarations: [
11 | ArticleListComponent
12 | ],
13 | bootstrap: [
14 | ArticleListComponent
15 | ]
16 | })
17 | export class AppModule {}
18 |
--------------------------------------------------------------------------------
/Chapter-02/3211/How-to-do-it/app/article-list.component.ts:
--------------------------------------------------------------------------------
1 | import {Component} from '@angular/core';
2 |
3 | @Component({
4 | selector: 'article-list',
5 | template: `
6 |
7 |
8 | {{i}}: {{article.title}}
9 |
10 |
11 | `
12 | })
13 | export class ArticleListComponent {
14 | articles:Array