From 60255b68c054421b7645c788c57c450ae448867c Mon Sep 17 00:00:00 2001 From: Kapunahele Wong Date: Thu, 19 Jul 2018 15:20:27 -0400 Subject: [PATCH] docs: re-write interpolation section and add example (#25170) PR Close #25170 --- .../interpolation/e2e/src/app.e2e-spec.ts | 47 +++++ .../interpolation/example-config.json | 0 .../interpolation/src/app/app.component.css | 0 .../interpolation/src/app/app.component.html | 59 ++++++ .../src/app/app.component.spec.ts | 27 +++ .../interpolation/src/app/app.component.ts | 25 +++ .../interpolation/src/app/app.module.ts | 18 ++ .../interpolation/src/app/customer.ts | 3 + .../interpolation/src/app/customers.ts | 9 + .../interpolation/src/assets/lamp.png | Bin 0 -> 33619 bytes .../interpolation/src/assets/potted-plant.png | Bin 0 -> 19892 bytes .../examples/interpolation/src/index.html | 14 ++ .../examples/interpolation/src/main.ts | 12 ++ .../examples/interpolation/stackblitz.json | 10 + .../property-binding/src/app/app.component.ts | 30 +++ aio/content/guide/template-syntax.md | 186 ++++++++++-------- 16 files changed, 360 insertions(+), 80 deletions(-) create mode 100644 aio/content/examples/interpolation/e2e/src/app.e2e-spec.ts create mode 100644 aio/content/examples/interpolation/example-config.json create mode 100644 aio/content/examples/interpolation/src/app/app.component.css create mode 100644 aio/content/examples/interpolation/src/app/app.component.html create mode 100644 aio/content/examples/interpolation/src/app/app.component.spec.ts create mode 100644 aio/content/examples/interpolation/src/app/app.component.ts create mode 100644 aio/content/examples/interpolation/src/app/app.module.ts create mode 100644 aio/content/examples/interpolation/src/app/customer.ts create mode 100644 aio/content/examples/interpolation/src/app/customers.ts create mode 100644 aio/content/examples/interpolation/src/assets/lamp.png create mode 100644 aio/content/examples/interpolation/src/assets/potted-plant.png create mode 100644 aio/content/examples/interpolation/src/index.html create mode 100644 aio/content/examples/interpolation/src/main.ts create mode 100644 aio/content/examples/interpolation/stackblitz.json create mode 100644 aio/content/examples/property-binding/src/app/app.component.ts diff --git a/aio/content/examples/interpolation/e2e/src/app.e2e-spec.ts b/aio/content/examples/interpolation/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000000..06def93fc6 --- /dev/null +++ b/aio/content/examples/interpolation/e2e/src/app.e2e-spec.ts @@ -0,0 +1,47 @@ +import { browser, element, by } from 'protractor'; + +describe('Interpolation e2e tests', () => { + + beforeEach(function () { + browser.get(''); + }); + + it('should display Interpolation and Template Expressions', function () { + expect(element(by.css('h1')).getText()).toEqual('Interpolation and Template Expressions'); + }); + + it('should display Current customer: Maria', function () { + expect(element.all(by.css('h3')).get(0).getText()).toBe(`Current customer: Maria`); + }); + + it('should display The sum of 1 + 1 is not 4.', function () { + expect(element.all(by.css('p:last-child')).get(0).getText()).toBe(`The sum of 1 + 1 is not 4.`); + }); + + it('should display Expression Context', function () { + expect(element.all(by.css('h2')).get(1).getText()).toBe(`Expression Context`); + }); + + it('should display a list of customers', function () { + expect(element.all(by.css('li')).get(0).getText()).toBe(`Maria`); + }); + + it('should display two pictures', function() { + let pottedPlant = element.all(by.css('img')).get(0); + let lamp = element.all(by.css('img')).get(1); + + expect(pottedPlant.getAttribute('src')).toContain('pottedPlant'); + expect(pottedPlant.isDisplayed()).toBe(true); + + expect(lamp.getAttribute('src')).toContain('lamp'); + expect(lamp.isDisplayed()).toBe(true); + }); + + it('should support user input', function () { + let input = element(by.css('input')); + let label = element(by.css('label')); + expect(label.getText()).toEqual('Type something:'); + input.sendKeys('abc'); + expect(label.getText()).toEqual('Type something: abc'); + }); +}); diff --git a/aio/content/examples/interpolation/example-config.json b/aio/content/examples/interpolation/example-config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/aio/content/examples/interpolation/src/app/app.component.css b/aio/content/examples/interpolation/src/app/app.component.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/aio/content/examples/interpolation/src/app/app.component.html b/aio/content/examples/interpolation/src/app/app.component.html new file mode 100644 index 0000000000..992627d3a5 --- /dev/null +++ b/aio/content/examples/interpolation/src/app/app.component.html @@ -0,0 +1,59 @@ + +
+

Interpolation and Template Expressions

+
+ +
+

Interpolation

+ +

Current customer: {{ currentCustomer }}

+ + + +

{{title}}

+
+ + +

Evaluating template expressions

+

Simple evaluation (to a string):

+ + +

The sum of 1 + 1 is {{1 + 1}}.

+ + +

Evaluates using a method (also evaluates to a string):

+ + +

The sum of 1 + 1 is not {{1 + 1 + getVal()}}.

+ +
+ +
+

Expression Context

+ +
+

Component context, properties of app.component.ts:

+ +

{{recommended}}

+ + +
+ +
+

Template context, template input variables (let customer):

+ +
    +
  • {{customer.name}}
  • +
+ +
+ +
+

Template context: template reference variables (#customerInput):

+ + +
+ +
diff --git a/aio/content/examples/interpolation/src/app/app.component.spec.ts b/aio/content/examples/interpolation/src/app/app.component.spec.ts new file mode 100644 index 0000000000..852c902d87 --- /dev/null +++ b/aio/content/examples/interpolation/src/app/app.component.spec.ts @@ -0,0 +1,27 @@ +import { TestBed, async } from '@angular/core/testing'; +import { AppComponent } from './app.component'; +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + it('should create the app', async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + it(`should have as title 'Featured product:'`, async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('Featured product:'); + })); + it('should render title in a p tag', async(() => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('p').textContent).toContain('Featured product:'); + })); +}); diff --git a/aio/content/examples/interpolation/src/app/app.component.ts b/aio/content/examples/interpolation/src/app/app.component.ts new file mode 100644 index 0000000000..06bb18afc0 --- /dev/null +++ b/aio/content/examples/interpolation/src/app/app.component.ts @@ -0,0 +1,25 @@ +import { Component } from '@angular/core'; + +import { CUSTOMERS } from './customers'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { + customers = CUSTOMERS; + + currentCustomer = 'Maria'; + title = 'Featured product:'; + itemImageUrl = '../assets/pottedPlant.png'; + + recommended = 'You might also like:'; + itemImageUrl2 = '../assets/lamp.png'; + + + + getVal(): number { return 2; } + + +} diff --git a/aio/content/examples/interpolation/src/app/app.module.ts b/aio/content/examples/interpolation/src/app/app.module.ts new file mode 100644 index 0000000000..926975afe8 --- /dev/null +++ b/aio/content/examples/interpolation/src/app/app.module.ts @@ -0,0 +1,18 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; + + +import { AppComponent } from './app.component'; + + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/aio/content/examples/interpolation/src/app/customer.ts b/aio/content/examples/interpolation/src/app/customer.ts new file mode 100644 index 0000000000..c191255efb --- /dev/null +++ b/aio/content/examples/interpolation/src/app/customer.ts @@ -0,0 +1,3 @@ +export class Customer { + name: string; +} diff --git a/aio/content/examples/interpolation/src/app/customers.ts b/aio/content/examples/interpolation/src/app/customers.ts new file mode 100644 index 0000000000..a1d25b93c9 --- /dev/null +++ b/aio/content/examples/interpolation/src/app/customers.ts @@ -0,0 +1,9 @@ +import { Customer } from './customer'; + +export const CUSTOMERS: Customer[] = [ + { name: 'Maria' }, + { name: 'Oliver' }, + { name: 'Walter' }, + { name: 'Lakshmi' }, + { name: 'Yasha' } +]; diff --git a/aio/content/examples/interpolation/src/assets/lamp.png b/aio/content/examples/interpolation/src/assets/lamp.png new file mode 100644 index 0000000000000000000000000000000000000000..5c97adfaea0bf7f16a054304daa750be6a96accf GIT binary patch literal 33619 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%0DC^ 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 R`+~uMn?|<{tI%!{{{aXra|r+d literal 0 HcmV?d00001 diff --git a/aio/content/examples/interpolation/src/index.html b/aio/content/examples/interpolation/src/index.html new file mode 100644 index 0000000000..92f30d0e84 --- /dev/null +++ b/aio/content/examples/interpolation/src/index.html @@ -0,0 +1,14 @@ + + + + + Interpolation + + + + + + + + + diff --git a/aio/content/examples/interpolation/src/main.ts b/aio/content/examples/interpolation/src/main.ts new file mode 100644 index 0000000000..91ec6da5f0 --- /dev/null +++ b/aio/content/examples/interpolation/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/aio/content/examples/interpolation/stackblitz.json b/aio/content/examples/interpolation/stackblitz.json new file mode 100644 index 0000000000..f33d39c88f --- /dev/null +++ b/aio/content/examples/interpolation/stackblitz.json @@ -0,0 +1,10 @@ +{ + "description": "Interpolation", + "files": [ + "!**/*.d.ts", + "!**/*.js", + "!**/*.[1,2].*" + ], + "file": "src/app/app.component.ts", + "tags": ["interpolation"] +} diff --git a/aio/content/examples/property-binding/src/app/app.component.ts b/aio/content/examples/property-binding/src/app/app.component.ts new file mode 100644 index 0000000000..1c52d44ebe --- /dev/null +++ b/aio/content/examples/property-binding/src/app/app.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; + + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { + itemImageUrl = '../assets/lamp.png'; + isUnchanged = true; + classes = 'special'; + // #docregion parent-data-type + parentItem = 'bananas'; + // #enddocregion parent-data-type + + // #docregion pass-object + currentItem = [{ + id: 21, + name: 'peaches' + }]; + // #enddocregion pass-object + + interpolationTitle = 'Interpolation'; + propertyTitle = 'Property binding'; + + // #docregion malicious-content + evilTitle = 'Template Syntax'; + // #enddocregion malicious-content +} diff --git a/aio/content/guide/template-syntax.md b/aio/content/guide/template-syntax.md index 68cd40d9ed..758ba8d8e7 100644 --- a/aio/content/guide/template-syntax.md +++ b/aio/content/guide/template-syntax.md @@ -42,31 +42,46 @@ Begin with the first form of data binding—interpolation—to see how m {@a interpolation} -## Interpolation ( {{...}} ) +## Interpolation and Template Expressions -You met the double-curly braces of interpolation, `{{` and `}}`, early in your Angular education. +Interpolation allows you to incorporate calculated strings into the text +between HTML element tags and within attribute assignments. Template +expressions are what you use to calculate those strings. - +The interpolation demonstrates all of +the syntax and code snippets described in this section. + +### Interpolation `{{...}}` + +Interpolation refers to embedding expressions into marked up text. +By default, interpolation uses as its delimiter the double curly braces, `{{` and `}}`. + +In the following snippet, `{{ currentCustomer }}` is an example of interpolation. + + -You use interpolation to weave calculated strings into the text between HTML element tags and within attribute assignments. +The text between the braces is often the name of a component +property. Angular replaces that name with the +string value of the corresponding component property. - + -The text between the braces is often the name of a component property. Angular replaces that name with the -string value of the corresponding component property. In the example above, Angular evaluates the `title` and `heroImageUrl` properties -and "fills in the blanks", first displaying a bold application title and then a heroic image. +In the example above, Angular evaluates the `title` and `itemImageUrl` properties +and fills in the blanks, first displaying some title text and then an image. -More generally, the text between the braces is a **template expression** that Angular first **evaluates** -and then **converts to a string**. The following interpolation illustrates the point by adding the two numbers: +More generally, the text between the braces is a **template expression** +that Angular first **evaluates** and then **converts to a string**. +The following interpolation illustrates the point by adding two numbers: - + -The expression can invoke methods of the host component such as `getVal()`, seen here: +The expression can invoke methods of the host component such as `getVal()` in +the following example: - + Angular evaluates all expressions in double curly braces, @@ -74,60 +89,67 @@ converts the expression results to strings, and links them with neighboring lite it assigns this composite interpolated result to an **element or directive property**. You appear to be inserting the result between element tags and assigning it to attributes. -It's convenient to think so, and you rarely suffer for this mistake. -Though this is not exactly true. Interpolation is a special syntax that Angular converts into a -[property binding](guide/template-syntax#property-binding), as is explained [below](guide/template-syntax#property-binding-or-interpolation). -But first, let's take a closer look at template expressions and statements. +

+However, interpolation is a special syntax that Angular converts into a +property binding. +If you'd like to use something other than `{{` and `}}`, you can +configure the interpolation delimiter via the +[interpolation](api/core/Component#interpolation) +option in the `Component` metadata. -
+
-{@a template-expressions} +### Template expressions -## Template expressions - -A template **expression** produces a value. +A template **expression** produces a value and appears within the double +curly braces, `{{ }}`. Angular executes the expression and assigns it to a property of a binding target; -the target might be an HTML element, a component, or a directive. +the target could be an HTML element, a component, or a directive. The interpolation braces in `{{1 + 1}}` surround the template expression `1 + 1`. -In the [property binding](guide/template-syntax#property-binding) section below, +In the property binding, a template expression appears in quotes to the right of the `=` symbol as in `[property]="expression"`. -You write these template expressions in a language that looks like JavaScript. -Many JavaScript expressions are legal template expressions, but not all. +In terms of syntax, template expressions are similar to JavaScript. +Many JavaScript expressions are legal template expressions, with a few exceptions. -JavaScript expressions that have or promote side effects are prohibited, +You can't use JavaScript expressions that have or promote side effects, including: -* assignments (`=`, `+=`, `-=`, ...) -* new -* chaining expressions with ; or , -* increment and decrement operators (`++` and `--`) +* Assignments (`=`, `+=`, `-=`, `...`) +* Operators such as `new`, `typeof`, `instanceof`, etc. +* Chaining expressions with ; or , +* The increment and decrement operators `++` and `--` +* Some of the ES2015+ operators Other notable differences from JavaScript syntax include: -* no support for the bitwise operators `|` and `&` -* new [template expression operators](guide/template-syntax#expression-operators), such as `|`, `?.` and `!`. - -{@a expression-context} +* No support for the bitwise operators such as `|` and `&` +* New template expression operators, such as `|`, `?.` and `!` + ### Expression context The *expression context* is typically the _component_ instance. -In the following snippets, the `title` within double-curly braces and the -`isUnchanged` in quotes refer to properties of the `AppComponent`. +In the following snippets, the `recommended` within double curly braces and the +`itemImageUrl2` in quotes refer to properties of the `AppComponent`. - + An expression may also refer to properties of the _template's_ context -such as a [template input variable](guide/template-syntax#template-input-variable) (`let hero`) -or a [template reference variable](guide/template-syntax#ref-vars) (`#heroInput`). +such as a template input variable, + +`let customer`, or a template reference variable, `#customerInput`. + - + + + + The context for terms in an expression is a blend of the _template variables_, @@ -136,34 +158,32 @@ If you reference a name that belongs to more than one of these namespaces, the template variable name takes precedence, followed by a name in the directive's _context_, and, lastly, the component's member names. -The previous example presents such a name collision. The component has a `hero` -property and the `*ngFor` defines a `hero` template variable. -The `hero` in `{{hero.name}}` +The previous example presents such a name collision. The component has a `customer` +property and the `*ngFor` defines a `customer` template variable. + +
+ +The `customer` in `{{customer.name}}` refers to the template input variable, not the component's property. Template expressions cannot refer to anything in -the global namespace (except `undefined`). They can't refer to `window` or `document`. They -can't call `console.log` or `Math.max`. They are restricted to referencing +the global namespace, except `undefined`. They can't refer to +`window` or `document`. Additionally, they +can't call `console.log()` or `Math.max()` and they are restricted to referencing members of the expression context. - -{@a no-side-effects} - -{@a expression-guidelines} +
### Expression guidelines -Template expressions can make or break an application. -Please follow these guidelines: +When using template expressions follow these guidelines: * [No visible side effects](guide/template-syntax#no-visible-side-effects) * [Quick execution](guide/template-syntax#quick-execution) * [Simplicity](guide/template-syntax#simplicity) -* [Idempotence](guide/template-syntax#idempotence) -The only exceptions to these guidelines should be in specific circumstances that you thoroughly understand. -#### No visible side effects +### No visible side effects A template expression should not change any application state other than the value of the target property. @@ -172,37 +192,43 @@ This rule is essential to Angular's "unidirectional data flow" policy. You should never worry that reading a component value might change some other displayed value. The view should be stable throughout a single rendering pass. -#### Quick execution +An [idempotent](https://en.wikipedia.org/wiki/Idempotence) expression is ideal because +it is free of side effects and improves Angular's change detection performance. + +In Angular terms, an idempotent expression always returns +*exactly the same thing* until +one of its dependent values changes. + +Dependent values should not change during a single turn of the event loop. +If an idempotent expression returns a string or a number, it returns the same string or number when called twice in a row. If the expression returns an object, including an `array`, it returns the same object *reference* when called twice in a row. + +
+ +There is one exception to this behavior that applies to `*ngFor`. `*ngFor` has `trackBy` functionality that can deal with referential inequality of objects that when iterating over them. + +For more information, see the [*ngFor with `trackBy`](guide/template-syntax#ngfor-with-trackby) section of this guide. + +
+ +### Quick execution Angular executes template expressions after every change detection cycle. Change detection cycles are triggered by many asynchronous activities such as -promise resolutions, http results, timer events, keypresses and mouse moves. +promise resolutions, HTTP results, timer events, key presses and mouse moves. Expressions should finish quickly or the user experience may drag, especially on slower devices. Consider caching values when their computation is expensive. -#### Simplicity +### Simplicity -Although it's possible to write quite complex template expressions, you should avoid them. +Although it's possible to write complex template expressions, it's a better +practice to avoid them. -A property name or method call should be the norm. -An occasional Boolean negation (`!`) is OK. -Otherwise, confine application and business logic to the component itself, -where it will be easier to develop and test. - -#### Idempotence - -An [idempotent](https://en.wikipedia.org/wiki/Idempotence) expression is ideal because -it is free of side effects and improves Angular's change detection performance. - -In Angular terms, an idempotent expression always returns *exactly the same thing* until -one of its dependent values changes. - -Dependent values should not change during a single turn of the event loop. -If an idempotent expression returns a string or a number, it returns the same string or number -when called twice in a row. If the expression returns an object (including an `array`), -it returns the same object *reference* when called twice in a row. +A property name or method call should be the norm, but an occasional Boolean negation, `!`, is OK. +Otherwise, confine application and business logic to the component, +where it is easier to develop and test. +
@@ -1673,8 +1699,8 @@ You can only bind to _another_ component or directive through its _Input_ and _O Remember that all **components** are **directives**. -The following discussion refers to _components_ for brevity and -because this topic is mostly a concern for component authors. +The following discussion refers to _components_ for brevity and +because this topic is mostly a concern for component authors.

Discussion

@@ -1985,7 +2011,7 @@ You'll need this template operator when you turn on strict null checks. It's opt {@a any-type-cast-function} -## The `$any` type cast function (`$any( )`) +## The `$any` type cast function (`$any( )`) Sometimes a binding expression will be reported as a type error and it is not possible or difficult to fully specify the type. To silence the error, you can use the `$any` cast function to cast @@ -1994,7 +2020,7 @@ the expression to [the `any` type](http://www.typescriptlang.org/docs/handbook/b -In this example, when the Angular compiler turns your template into TypeScript code, +In this example, when the Angular compiler turns your template into TypeScript code, it prevents TypeScript from reporting that `marker` is not a member of the `Hero` interface.