Merge remote-tracking branch 'origin/master'
# Conflicts: # public/docs/ts/latest/guide/dependency-injection.jade
This commit is contained in:
commit
6b8e09bf2b
|
@ -960,8 +960,9 @@ function devGuideExamplesWatch(shredOptions, postShredAction) {
|
||||||
// removed this version because gulp.watch has the same glob issue that dgeni has.
|
// removed this version because gulp.watch has the same glob issue that dgeni has.
|
||||||
// var excludePattern = '!' + path.join(shredOptions.examplesDir, '**/node_modules/**/*.*');
|
// var excludePattern = '!' + path.join(shredOptions.examplesDir, '**/node_modules/**/*.*');
|
||||||
// gulp.watch([includePattern, excludePattern], {readDelay: 500}, function (event, done) {
|
// gulp.watch([includePattern, excludePattern], {readDelay: 500}, function (event, done) {
|
||||||
var files = globby.sync( [includePattern], { ignore: [ '**/node_modules/**', '**/_fragments/**',
|
var ignoreThese = [ '**/node_modules/**', '**/_fragments/**',
|
||||||
'**/dart/build/**' ]});
|
'**/dart/.pub/**', '**/dart/build/**', '**/dart/packages/**'];
|
||||||
|
var files = globby.sync( [includePattern], { ignore: ignoreThese });
|
||||||
gulp.watch([files], {readDelay: 500}, function (event, done) {
|
gulp.watch([files], {readDelay: 500}, function (event, done) {
|
||||||
gutil.log('Dev Guide example changed')
|
gutil.log('Dev Guide example changed')
|
||||||
gutil.log('Event type: ' + event.type); // added, changed, or deleted
|
gutil.log('Event type: ' + event.type); // added, changed, or deleted
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"name": "Architecture overview",
|
"title": "Architecture Overview",
|
||||||
"docHref": "https://angular.io/docs/dart/latest/guide/architecture.html"
|
"docPart": "guide"
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"title": "Attribute Directives",
|
||||||
|
"docPart": "guide"
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"name": "Dependency injection",
|
"title": "Dependency Injection",
|
||||||
"docHref": "https://angular.io/docs/dart/latest/guide/dependency-injection.html"
|
"docPart": "guide"
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,15 +29,18 @@ class ProviderComponent1 {
|
||||||
|
|
||||||
/// Component just used to ensure that shared E2E tests pass.
|
/// Component just used to ensure that shared E2E tests pass.
|
||||||
@Component(
|
@Component(
|
||||||
selector: 'provider-3a',
|
selector: 'provider-3',
|
||||||
template: '{{log}}',
|
template: '{{log}}',
|
||||||
providers: const [const Provider(Logger, useClass: Logger)]
|
providers:
|
||||||
|
// #docregion providers-3
|
||||||
|
const [const Provider(Logger, useClass: Logger)]
|
||||||
|
// #enddocregion providers-3
|
||||||
)
|
)
|
||||||
class ProviderComponent3a {
|
class ProviderComponent3 {
|
||||||
String log;
|
String log;
|
||||||
|
|
||||||
ProviderComponent3a(Logger logger) {
|
ProviderComponent3(Logger logger) {
|
||||||
logger.log('Hello from logger provided with {provide: Logger, useClass: Logger}');
|
logger.log('Hello from logger provided with useClass:Logger');
|
||||||
log = logger.logs[0];
|
log = logger.logs[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -250,7 +253,7 @@ class ProviderComponent10 implements OnInit {
|
||||||
template: '''
|
template: '''
|
||||||
<h2>Provider variations</h2>
|
<h2>Provider variations</h2>
|
||||||
<div id="p1"><provider-1></provider-1></div>
|
<div id="p1"><provider-1></provider-1></div>
|
||||||
<div id="p3a"><provider-3a></provider-3a></div>
|
<div id="p3"><provider-3></provider-3></div>
|
||||||
<div id="p4"><provider-4></provider-4></div>
|
<div id="p4"><provider-4></provider-4></div>
|
||||||
<div id="p5"><provider-5></provider-5></div>
|
<div id="p5"><provider-5></provider-5></div>
|
||||||
<div id="p6a"><provider-6a></provider-6a></div>
|
<div id="p6a"><provider-6a></provider-6a></div>
|
||||||
|
@ -261,7 +264,7 @@ class ProviderComponent10 implements OnInit {
|
||||||
<div id="p10"><provider-10></provider-10></div>''',
|
<div id="p10"><provider-10></provider-10></div>''',
|
||||||
directives: const [
|
directives: const [
|
||||||
ProviderComponent1,
|
ProviderComponent1,
|
||||||
ProviderComponent3a,
|
ProviderComponent3,
|
||||||
ProviderComponent4,
|
ProviderComponent4,
|
||||||
ProviderComponent5,
|
ProviderComponent5,
|
||||||
ProviderComponent6a,
|
ProviderComponent6a,
|
||||||
|
|
|
@ -80,9 +80,9 @@ describe('Dependency Injection Tests', function () {
|
||||||
expect(element(by.css('#p1')).getText()).toEqual(expectedMsg);
|
expect(element(by.css('#p1')).getText()).toEqual(expectedMsg);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('P3a (provide) displays as expected', function () {
|
it('P3 (provide) displays as expected', function () {
|
||||||
expectedMsg = 'Hello from logger provided with { provide: Logger, useClass: Logger }';
|
expectedMsg = 'Hello from logger provided with useClass:Logger';
|
||||||
expect(element(by.css('#p3a')).getText()).toEqual(expectedMsg);
|
expect(element(by.css('#p3')).getText()).toEqual(expectedMsg);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('P4 (useClass:BetterLogger) displays as expected', function () {
|
it('P4 (useClass:BetterLogger) displays as expected', function () {
|
||||||
|
|
|
@ -31,17 +31,17 @@ export class ProviderComponent1 {
|
||||||
|
|
||||||
//////////////////////////////////////////
|
//////////////////////////////////////////
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'provider-3a',
|
selector: 'provider-3',
|
||||||
template: template,
|
template: template,
|
||||||
providers:
|
providers:
|
||||||
// #docregion providers-3a
|
// #docregion providers-3
|
||||||
[{ provide: Logger, useClass: Logger }]
|
[{ provide: Logger, useClass: Logger }]
|
||||||
// #enddocregion providers-3a
|
// #enddocregion providers-3
|
||||||
})
|
})
|
||||||
export class ProviderComponent3a {
|
export class ProviderComponent3 {
|
||||||
log: string;
|
log: string;
|
||||||
constructor(logger: Logger) {
|
constructor(logger: Logger) {
|
||||||
logger.log('Hello from logger provided with { provide: Logger, useClass: Logger }');
|
logger.log('Hello from logger provided with useClass:Logger');
|
||||||
this.log = logger.logs[0];
|
this.log = logger.logs[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -252,7 +252,7 @@ export class ProviderComponent10 {
|
||||||
template: `
|
template: `
|
||||||
<h2>Provider variations</h2>
|
<h2>Provider variations</h2>
|
||||||
<div id="p1"><provider-1></provider-1></div>
|
<div id="p1"><provider-1></provider-1></div>
|
||||||
<div id="p3a"><provider-3a></provider-3a></div>
|
<div id="p3"><provider-3></provider-3></div>
|
||||||
<div id="p4"><provider-4></provider-4></div>
|
<div id="p4"><provider-4></provider-4></div>
|
||||||
<div id="p5"><provider-5></provider-5></div>
|
<div id="p5"><provider-5></provider-5></div>
|
||||||
<div id="p6a"><provider-6a></provider-6a></div>
|
<div id="p6a"><provider-6a></provider-6a></div>
|
||||||
|
@ -264,7 +264,7 @@ export class ProviderComponent10 {
|
||||||
`,
|
`,
|
||||||
directives: [
|
directives: [
|
||||||
ProviderComponent1,
|
ProviderComponent1,
|
||||||
ProviderComponent3a,
|
ProviderComponent3,
|
||||||
ProviderComponent4,
|
ProviderComponent4,
|
||||||
ProviderComponent5,
|
ProviderComponent5,
|
||||||
ProviderComponent6a,
|
ProviderComponent6a,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"name": "Displaying data",
|
"title": "Displaying Data",
|
||||||
"docHref": "https://angular.io/docs/dart/latest/guide/displaying-data.html"
|
"docPart": "guide"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"name": "Forms",
|
"title": "Forms",
|
||||||
"docHref": "https://angular.io/docs/dart/latest/guide/forms.html"
|
"docPart": "guide"
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"title": "Hierarchical Dependency Injection",
|
||||||
|
"docPart": "guide"
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"title": "Pipes",
|
||||||
|
"docPart": "guide"
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"title": "QuickStart"
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"name": "HTTP client (server communication)",
|
"title": "HTTP Client (Server Communication)",
|
||||||
"docHref": "https://angular.io/docs/dart/latest/guide/server-communication.html"
|
"docPart": "guide"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"name": "Template Syntax",
|
"title": "Template Syntax",
|
||||||
"docHref": "https://angular.io/docs/ts/latest/guide/template-syntax.html"
|
"docPart": "guide"
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"title": "Tour of Heroes: The Hero Editor",
|
||||||
|
"docPart": "tutorial",
|
||||||
|
"docHref": "toh-pt1.html"
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"title": "Tour of Heroes: Master/Detail",
|
||||||
|
"docPart": "tutorial",
|
||||||
|
"docHref": "toh-pt2.html"
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
// #docregion pt2
|
// #docregion
|
||||||
import 'package:angular2/core.dart';
|
import 'package:angular2/core.dart';
|
||||||
|
|
||||||
class Hero {
|
class Hero {
|
||||||
|
@ -29,7 +29,7 @@ class Hero {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
''',
|
''',
|
||||||
// #docregion styles-1
|
// #docregion styles
|
||||||
styles: const [
|
styles: const [
|
||||||
'''
|
'''
|
||||||
.selected {
|
.selected {
|
||||||
|
@ -80,21 +80,21 @@ class Hero {
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
])
|
])
|
||||||
// #enddocregion styles-1
|
// #enddocregion styles
|
||||||
class AppComponent {
|
class AppComponent {
|
||||||
final String title = 'Tour of Heroes';
|
final String title = 'Tour of Heroes';
|
||||||
final List<Hero> heroes = mockHeroes;
|
final List<Hero> heroes = mockHeroes;
|
||||||
// #docregion selected-hero-1
|
// #docregion selected-hero
|
||||||
Hero selectedHero;
|
Hero selectedHero;
|
||||||
// #enddocregion selected-hero-1
|
// #enddocregion selected-hero
|
||||||
|
|
||||||
// #docregion on-select-1
|
// #docregion on-select
|
||||||
onSelect(Hero hero) {
|
onSelect(Hero hero) {
|
||||||
selectedHero = hero;
|
selectedHero = hero;
|
||||||
}
|
}
|
||||||
// #enddocregion on-select-1
|
// #enddocregion on-select
|
||||||
}
|
}
|
||||||
// #enddocregion pt2
|
// #enddocregion
|
||||||
|
|
||||||
// #docregion hero-array
|
// #docregion hero-array
|
||||||
final List<Hero> mockHeroes = [
|
final List<Hero> mockHeroes = [
|
||||||
|
@ -109,6 +109,3 @@ final List<Hero> mockHeroes = [
|
||||||
new Hero(19, 'Magma'),
|
new Hero(19, 'Magma'),
|
||||||
new Hero(20, 'Tornado')
|
new Hero(20, 'Tornado')
|
||||||
];
|
];
|
||||||
// #enddocregion hero-array
|
|
||||||
|
|
||||||
// #enddocregion pt2
|
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
// #docregion pt2
|
|
||||||
import 'package:angular2/platform/browser.dart';
|
import 'package:angular2/platform/browser.dart';
|
||||||
|
|
||||||
import 'package:angular2_tour_of_heroes/app_component.dart';
|
import 'package:angular2_tour_of_heroes/app_component.dart';
|
||||||
|
|
||||||
main() {
|
void main() {
|
||||||
bootstrap(AppComponent);
|
bootstrap(AppComponent);
|
||||||
}
|
}
|
||||||
// #enddocregion pt2
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"title": "Tour of Heroes: Multiple Components",
|
||||||
|
"docPart": "tutorial",
|
||||||
|
"docHref": "toh-pt3.html"
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"title": "Tour of Heroes: Services",
|
||||||
|
"docPart": "tutorial",
|
||||||
|
"docHref": "toh-pt4.html"
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"title": "Tour of Heroes: Routing",
|
||||||
|
"docPart": "tutorial",
|
||||||
|
"docHref": "toh-pt5.html"
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"name": "User input",
|
"title": "User Input",
|
||||||
"docHref": "https://angular.io/docs/dart/latest/guide/user-input.html"
|
"docPart": "guide"
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,8 +43,10 @@ block real-logger
|
||||||
A real implementation would probably use the
|
A real implementation would probably use the
|
||||||
[logging package](https://pub.dartlang.org/packages/logging).
|
[logging package](https://pub.dartlang.org/packages/logging).
|
||||||
|
|
||||||
block optional-logger
|
block canonical-provider-expr
|
||||||
//- TBC.
|
| that creates a new instance of the
|
||||||
|
a(href="../api/core/Provider-class.html") Provider
|
||||||
|
| class:
|
||||||
|
|
||||||
block provider-ctor-args
|
block provider-ctor-args
|
||||||
- var _secondParam = 'named parameter, such as <code>useClass</code>'
|
- var _secondParam = 'named parameter, such as <code>useClass</code>'
|
||||||
|
@ -61,7 +63,8 @@ block dart-diff-const-metadata
|
||||||
Instead, we use constant literals or constant constructors.
|
Instead, we use constant literals or constant constructors.
|
||||||
For example, a TypeScript program will use the
|
For example, a TypeScript program will use the
|
||||||
object literal `{ provide: Logger, useClass: BetterLogger }`.
|
object literal `{ provide: Logger, useClass: BetterLogger }`.
|
||||||
A Dart annotation would instead use the constant value `const Provider(Logger, useClass: BetterLogger)`.
|
A Dart annotation would instead use the constant value
|
||||||
|
`const Provider(Logger, useClass: BetterLogger)`.
|
||||||
|
|
||||||
block dart-diff-const-metadata-ctor
|
block dart-diff-const-metadata-ctor
|
||||||
.callout.is-helpful
|
.callout.is-helpful
|
||||||
|
|
|
@ -6,14 +6,12 @@ include ../_util-fns
|
||||||
We’ll expand our Tour of Heroes app to display a list of heroes,
|
We’ll expand our Tour of Heroes app to display a list of heroes,
|
||||||
allow the user to select a hero, and display the hero’s details.
|
allow the user to select a hero, and display the hero’s details.
|
||||||
|
|
||||||
|
p Run the #[+liveExampleLink2('', 'toh-2')] for this part.
|
||||||
|
:marked
|
||||||
Let’s take stock of what we’ll need to display a list of heroes.
|
Let’s take stock of what we’ll need to display a list of heroes.
|
||||||
First, we need a list of heroes. We want to display those heroes in the view’s template,
|
First, we need a list of heroes. We want to display those heroes in the view’s template,
|
||||||
so we’ll need a way to do that.
|
so we’ll need a way to do that.
|
||||||
|
|
||||||
.callout.is-helpful
|
|
||||||
header Source code
|
|
||||||
p Run the #[+liveExampleLink2('', 'toh-2')] for this part.
|
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:marked
|
:marked
|
||||||
## Where We Left Off
|
## Where We Left Off
|
||||||
|
@ -48,7 +46,7 @@ code-example(language="bash").
|
||||||
### Creating heroes
|
### Creating heroes
|
||||||
Let’s create a list of ten heroes at the bottom of `app_component.dart`.
|
Let’s create a list of ten heroes at the bottom of `app_component.dart`.
|
||||||
|
|
||||||
+makeExample('toh-2/dart/lib/app_component.dart', 'hero-array', 'app_component.dart (Hero list)')(format=".")
|
+makeExample('toh-2/dart/lib/app_component.dart', 'hero-array', 'app_component.dart (hero list)')(format=".")
|
||||||
|
|
||||||
:marked
|
:marked
|
||||||
The `mockHeroes` list is of type `Hero`, the class defined in part one,
|
The `mockHeroes` list is of type `Hero`, the class defined in part one,
|
||||||
|
@ -59,7 +57,7 @@ code-example(language="bash").
|
||||||
### Exposing heroes
|
### Exposing heroes
|
||||||
Let’s create a public property in `AppComponent` that exposes the heroes for binding.
|
Let’s create a public property in `AppComponent` that exposes the heroes for binding.
|
||||||
|
|
||||||
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'hero-array-1', 'app_component.dart (Hero list property)')
|
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'hero-array-1', 'app_component.dart (hero list property)')
|
||||||
|
|
||||||
.l-sub-section
|
.l-sub-section
|
||||||
:marked
|
:marked
|
||||||
|
@ -72,7 +70,7 @@ code-example(language="bash").
|
||||||
Our component has `heroes`. Let’s create an unordered list in our template to display them.
|
Our component has `heroes`. Let’s create an unordered list in our template to display them.
|
||||||
We’ll insert the following chunk of HTML below the title and above the hero details.
|
We’ll insert the following chunk of HTML below the title and above the hero details.
|
||||||
|
|
||||||
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'heroes-template-1', 'app_component.dart (Heroes template)')(format=".")
|
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'heroes-template-1', 'app_component.dart (heroes template)')(format=".")
|
||||||
|
|
||||||
:marked
|
:marked
|
||||||
Now we have a template that we can fill with our heroes.
|
Now we have a template that we can fill with our heroes.
|
||||||
|
@ -103,7 +101,7 @@ code-example(language="bash").
|
||||||
“*take each hero in the `heroes` list, store it in the local `hero` variable,
|
“*take each hero in the `heroes` list, store it in the local `hero` variable,
|
||||||
and make it available to the corresponding template instance*”.
|
and make it available to the corresponding template instance*”.
|
||||||
|
|
||||||
The `let` keyword before "hero" identifies the `hero` as a template input variable.
|
The `let` keyword before "hero" identifies `hero` as a template input variable.
|
||||||
We can reference this variable within the template to access a hero’s properties.
|
We can reference this variable within the template to access a hero’s properties.
|
||||||
|
|
||||||
Learn more about `ngFor` and template input variables in the
|
Learn more about `ngFor` and template input variables in the
|
||||||
|
@ -126,21 +124,20 @@ code-example(language="bash").
|
||||||
Let’s add some styles to our component by setting the `styles` argument of the `@Component` annotation
|
Let’s add some styles to our component by setting the `styles` argument of the `@Component` annotation
|
||||||
to the following CSS classes:
|
to the following CSS classes:
|
||||||
|
|
||||||
+makeExample('toh-2/dart/lib/app_component.dart', 'styles-1', 'app_component.dart (Styling)')(format=".")
|
+makeExample('toh-2/dart/lib/app_component.dart', 'styles', 'app_component.dart (styles)')(format=".")
|
||||||
|
|
||||||
:marked
|
:marked
|
||||||
Notice that we again use the triple-quote notation for multi-line strings.
|
Notice that we again use the triple-quote notation for multi-line strings.
|
||||||
|
|
||||||
|
That's a lot of styles! We can put them inline as shown here, or we can move them out to their own file which will make it easier to code our component.
|
||||||
|
We'll do this in a later chapter. For now let's keep rolling.
|
||||||
|
|
||||||
When we assign styles to a component they are scoped to that specific component.
|
When we assign styles to a component they are scoped to that specific component.
|
||||||
Our styles will only apply to our `AppComponent` and won't "leak" to the outer HTML.
|
Our styles will only apply to our `AppComponent` and won't "leak" to the outer HTML.
|
||||||
|
|
||||||
Our template for displaying the heroes should now look like this:
|
Our template for displaying the heroes should now look like this:
|
||||||
|
|
||||||
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'heroes-styled', 'app_component.dart (Styled heroes)')
|
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'heroes-styled', 'app_component.dart (styled heroes)')
|
||||||
|
|
||||||
:marked
|
|
||||||
That's a lot of styles! We can put them inline as shown here, or we can move them out to their own file which will make it easier to code our component.
|
|
||||||
We'll do this in a later chapter. For now let's keep rolling.
|
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:marked
|
:marked
|
||||||
|
@ -156,7 +153,7 @@ code-example(language="bash").
|
||||||
### Click event
|
### Click event
|
||||||
We modify the `<li>` by inserting an Angular event binding to its click event.
|
We modify the `<li>` by inserting an Angular event binding to its click event.
|
||||||
|
|
||||||
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'selectedHero-click', 'app_component.dart (Capturing the click event)')(format=".")
|
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'selectedHero-click', 'app_component.dart (template excerpt)')(format=".")
|
||||||
|
|
||||||
:marked
|
:marked
|
||||||
Focus on the event binding
|
Focus on the event binding
|
||||||
|
@ -185,21 +182,21 @@ code-example(language="bash").
|
||||||
We no longer need the static `hero` property of the `AppComponent`.
|
We no longer need the static `hero` property of the `AppComponent`.
|
||||||
**Replace** it with this simple `selectedHero` property:
|
**Replace** it with this simple `selectedHero` property:
|
||||||
|
|
||||||
+makeExample('toh-2/dart/lib/app_component.dart', 'selected-hero-1', 'app_component.dart (selectedHero)')
|
+makeExample('toh-2/dart/lib/app_component.dart', 'selected-hero', 'app_component.dart (selectedHero)')
|
||||||
|
|
||||||
:marked
|
:marked
|
||||||
We’ve decided that none of the heroes should be selected before the user picks a hero so
|
We’ve decided that none of the heroes should be selected before the user picks a hero so
|
||||||
we won’t initialize the `selectedHero` as we were doing with `hero`.
|
we won’t initialize the `selectedHero` as we were doing with `hero`.
|
||||||
|
|
||||||
Now **add an `onSelect` method** that sets the `selectedHero` property to the `hero` the user clicked.
|
Now **add an `onSelect` method** that sets the `selectedHero` property to the `hero` the user clicked.
|
||||||
+makeExample('toh-2/dart/lib/app_component.dart', 'on-select-1', 'app_component.dart (onSelect)')(format=".")
|
+makeExample('toh-2/dart/lib/app_component.dart', 'on-select', 'app_component.dart (onSelect)')(format=".")
|
||||||
|
|
||||||
:marked
|
:marked
|
||||||
We will be showing the selected hero's details in our template.
|
We will be showing the selected hero's details in our template.
|
||||||
At the moment, it is still referring to the old `hero` property.
|
At the moment, it is still referring to the old `hero` property.
|
||||||
Let’s fix the template to bind to the new `selectedHero` property.
|
Let’s fix the template to bind to the new `selectedHero` property.
|
||||||
|
|
||||||
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'selectedHero-details', 'app_component.dart (Binding to the selectedHero\'s name)')(format=".")
|
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'selectedHero-details', 'app_component.dart (template excerpt)')(format=".")
|
||||||
:marked
|
:marked
|
||||||
### Hide the empty detail with ngIf
|
### Hide the empty detail with ngIf
|
||||||
|
|
||||||
|
@ -261,16 +258,16 @@ code-example(language="bash").
|
||||||
|
|
||||||
The key is the name of the CSS class (`selected`). The value is `true` if the two heroes match and `false` otherwise.
|
The key is the name of the CSS class (`selected`). The value is `true` if the two heroes match and `false` otherwise.
|
||||||
We’re saying “*apply the `selected` class if the heroes match, remove it if they don’t*”.
|
We’re saying “*apply the `selected` class if the heroes match, remove it if they don’t*”.
|
||||||
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'class-selected-1', 'app_component.dart (Setting the CSS class)')(format=".")
|
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'class-selected-1', 'app_component.dart (setting the CSS class)')(format=".")
|
||||||
:marked
|
:marked
|
||||||
Notice in the template that the `class.selected` is surrounded in square brackets (`[]`).
|
Notice in the template that the `class.selected` is surrounded in square brackets (`[]`).
|
||||||
This is the syntax for a Property Binding, a binding in which data flows one way
|
This is the syntax for a **property binding**, a binding in which data flows one way
|
||||||
from the data source (the expression `hero == selectedHero`) to a property of `class`.
|
from the data source (the expression `hero == selectedHero`) to a property of `class`.
|
||||||
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'class-selected-2', 'app_component.dart (Styling each hero)')(format=".")
|
+makeExample('toh-2/dart-snippets/app_component_snippets_pt2.dart', 'class-selected-2', 'app_component.dart (styling each hero)')(format=".")
|
||||||
|
|
||||||
.l-sub-section
|
.l-sub-section
|
||||||
:marked
|
:marked
|
||||||
Learn more about [Property Binding](../guide/template-syntax.html#property-binding)
|
Learn more about [property bindings](../guide/template-syntax.html#property-binding)
|
||||||
in the Template Syntax chapter.
|
in the Template Syntax chapter.
|
||||||
|
|
||||||
:marked
|
:marked
|
||||||
|
@ -285,7 +282,7 @@ code-example(language="bash").
|
||||||
|
|
||||||
Here's the complete `app_component.dart` as it stands now:
|
Here's the complete `app_component.dart` as it stands now:
|
||||||
|
|
||||||
+makeExample('toh-2/dart/lib/app_component.dart', 'pt2', 'app_component.dart')
|
+makeExample('toh-2/dart/lib/app_component.dart', '', 'app_component.dart')
|
||||||
|
|
||||||
.l-main-section
|
.l-main-section
|
||||||
:marked
|
:marked
|
||||||
|
@ -296,6 +293,8 @@ code-example(language="bash").
|
||||||
* We added the ability to select a hero and show the hero’s details
|
* We added the ability to select a hero and show the hero’s details
|
||||||
* We learned how to use the built-in directives `ngIf` and `ngFor` in a component’s template
|
* We learned how to use the built-in directives `ngIf` and `ngFor` in a component’s template
|
||||||
|
|
||||||
|
p Run the #[+liveExampleLink2('', 'toh-2')] for this part.
|
||||||
|
:marked
|
||||||
### The Road Ahead
|
### The Road Ahead
|
||||||
Our Tour of Heroes has grown, but it’s far from complete.
|
Our Tour of Heroes has grown, but it’s far from complete.
|
||||||
We can't put the entire app into a single component.
|
We can't put the entire app into a single component.
|
||||||
|
|
|
@ -809,16 +809,18 @@ code-example(format="nocode").
|
||||||
|
|
||||||
+makeExample('dependency-injection/ts/app/providers.component.ts','providers-1')
|
+makeExample('dependency-injection/ts/app/providers.component.ts','providers-1')
|
||||||
|
|
||||||
:marked
|
p
|
||||||
This is actually a short-hand expression for a provider registration using the _provider_ object literal.
|
| This is actually a short-hand expression for a provider registration
|
||||||
|
block canonical-provider-expr
|
||||||
|
| using a <i>provider</i> object literal with two properties:
|
||||||
|
p
|
||||||
|
| 这实际上是用_provider_对象的字面量注册供应商的缩写表达式。
|
||||||
|
|
||||||
这实际上是使用_provider_对象常量注册供应商的缩写表达式。
|
+makeExample('dependency-injection/ts/app/providers.component.ts','providers-3')
|
||||||
|
|
||||||
+makeExample('dependency-injection/ts/app/providers.component.ts','providers-3a')
|
|
||||||
|
|
||||||
block provider-ctor-args
|
block provider-ctor-args
|
||||||
- var _secondParam = 'provider definition object';
|
- var _secondParam = 'provider definition object';
|
||||||
//- var _secondParam = _docsFor == 'dart' ? 'named parameter, such as <code>useClass</code>' : 'provider definition object';
|
|
||||||
:marked
|
:marked
|
||||||
The first is the [token](#token) that serves as the key for both locating a dependency value
|
The first is the [token](#token) that serves as the key for both locating a dependency value
|
||||||
and registering the provider.
|
and registering the provider.
|
||||||
|
|
Loading…
Reference in New Issue