gpt4 book ai didi

angular - 在 Angular 模板中创建本地绑定(bind)上下文

转载 作者:太空狗 更新时间:2023-10-29 18:30:55 25 4
gpt4 key购买 nike

假设我有一个深度嵌套的对象图,我要绑定(bind)到:

<div>{{model.rootProperty}}</div>

<div>
<div>{{model.some.deeply.nested.property.with.a.donut.name}}</div>
<div>{{model.some.deeply.nested.property.with.a.donut.calories}}</div>
<div>{{model.some.deeply.nested.property.with.a.donut.deliciousness}}</div>
</div>

我不想重复访问器链。我知道我可以在我的 View 模型上公开一个属性,但我更愿意以某种方式创建本地上下文。我想要的语法是这样的:

<div>{{model.rootProperty}}</div>

<div [binding-context]="model.some.deeply.nested.property.with.a.donut">
<div>{{name}}</div>
<div>{{calories}}</div>
<div>{{deliciousness}}</div>
</div>

我该怎么做?

我尝试创建一个组件,其模板仅包含 <ng-content></ng-content> , 但以这种方式嵌入的内容仍然具有组件父组件的上下文。

我知道我可以将内部内容包装在 <template> 中并在我的组件中使用模板导出,但这比我更喜欢的标记更多,而且似乎 *ngFor不需要这个。

这可能吗?

最佳答案

可以定义类似于 *ngIf 和 *ngFor 的结构指令,称为 *bindingContext:

<div *bindingContext = "let  a_variable  be  an_expression">

Angular 使用这种语法在幕后做了很多魔术。首先,asterics 创建了一个立即使用的 。然后评估微语法并调用名为 bindingContextBe 的指令。该指令使 an_expression 在模板上下文中作为 $implicit 可用,而模板上下文又被分配给 a_variable

Angular documentation 中有完整的解释.

我按如下方式实现了 BindingContext:

import {Directive, EmbeddedViewRef, Input, 
TemplateRef, ViewContainerRef} from '@angular/core';

@Directive({selector: '[bindingContextBe]'})
export class BindingContextDirective {
private context = new BindingContextDirectiveContext();
private viewRef: EmbeddedViewRef<BindingContextDirectiveContext>|null = null;

constructor(private viewContainer: ViewContainerRef,
private templateRef: TemplateRef<BindingContextDirectiveContext>) {
}

@Input()
set bindingContextBe(context: any) {
this.context.$implicit = context;
if (!this.viewRef) {
this.viewContainer.clear();
this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef,
this.context);
}
}
}

export class BindingContextDirectiveContext {
public $implicit: any = null;
}

使用示例:

Full:

<div>
<div>{{model.some.deeply.nested.property.with.a.donut.name}}</div>
<div>{{model.some.deeply.nested.property.with.a.donut.calories}}</div>
<div>{{model.some.deeply.nested.property.with.a.donut.deliciousness}}</div>
<input [(ngModel)]="model.some.deeply.nested.property.with.a.donut.name">
</div>

<hr>

Alias:

<div *bindingContext="let food be model.some.deeply.nested.property.with.a.donut">
<div>{{food.name}}</div>
<div>{{food.calories}}</div>
<div>{{food.deliciousness}}</div>
<input [(ngModel)]="food.name">
</div>

PS:不要忘记在您的模块中声明方向。

关于angular - 在 Angular 模板中创建本地绑定(bind)上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45337603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com