let-* $implicit in Angular template
Синтаксис let-*
позволяет объявить переменную в шаблоне <ng-template>
.
<ng-template let-vasya="Василий">
<div>{{ vasya }}</div>
</ng-template>
Практическое значение let-* раскрывается когда шаблон используется в компоненте и нужно из шаблона обратиться к свойствам и методам компонента. Также этот синтаксис позволяет компоненту избежать коллизий имен.
Например в модальных окнах от ng-bootstrap используется конструкция:
<ng-template #content let-c="close" let-d="dismiss">
<div class="modal-header">
<h4>Adding number filter</h4>
...
<button (click)="c('Save click')">Save</button>
</div>
...
</ng-template>
В переменную c
записывается метод close()
модального окна. В дальнейшей в шаблоне на кнопку сохранения вешается обработчик клика (click)="c('Save click')"
Использование let-*
в директиве *ngFor
Запись с *ngFor
<div *ngFor="let tyapk of tyapks; index as i; trackBy: trackByFn">{{ tyapk }}</div>
без сахара становится [ngFor]
<ng-template [ngFor]="let tyapk of tyapks" >
<div>{{ tyapk }}</div>
</ng-template>
что эквивалентно [ngForOf]
с неявной переменной $implicit
<ng-template ngFor let-tyapk="$implicit" [ngForOf]="tyapks" let-i="index" [ngForTrackBy]="trackByFn">
<div>{{ tyapk }}</div>
</ng-template>
$implicit
Когда Agluar создает шаблон, вызывая метод createEmbeddedView, может передаваться контекст, который будет использоваться внутри <ng-template>
.
Использования ключа $implicit
в объекте контекста будет устанавливать значение объекта по-умолчанию. Например:
Имеется вызов:
this._viewContainerRef.createEmbeddedView(ourTemplate, { $implicit: 'tyapk' })
шаблон
<ng-template let-foo>
{{ foo }}
</ng-template>
тогда следующая записаь эквивалентна:
<ng-template let-foo="$implicit">
{{ foo }}
</ng-template>
В первом и во втором случае foo
будет равно tyapk
При этом, если имеется следующий контекст:
{ bar: 'value' }
то переменная объявляется как:
<ng-template let-foo="bar">
{{ foo }}
</ng-template>
ngTemplateOutlet и ngTemplateOutletContext
Имеется шаблон
<ng-template #ourTemplate let-foo let-bar="petya" let-baz>
<div>{{foo}}</div>
<div>{{bar}}</div>
<div>{{baz}}</div>
</ng-template>
Вместо createEmbeddedView
можно отрисовать с помощью 2 директив: [ngTemplateOutlet]
и [ngTemplateOutletContext]
+ возможность добавить контекст.
<ng-template
[ngTemplateOutlet]="ourTemplate"
[ngTemplateOutletContext]="{
$implicit: 'Иннокентий',
bar: 'tyapk'
}"
></ng-template>
В foo
и baz
явно не переданы значения, поэтому они выведут неявное значение Иннокентий.
- Angular microsyntax
- NgForOf
- Use
<ng-template>
- Создаем шаблонизируемые переиспользуемые компоненты в Angular 2
- What is $implicit in angular 2?
- Angular ngFor,
and the compiler - What is the difference between [ngFor] and [ngForOf] in angular2?
- http://qaru.site/questions/183137/what-is-let-in-angular-2-templates