【发布时间】:2016-08-07 03:38:12
【问题描述】:
有人可以解释以下行为背后的原因吗?
假设我们有一个 Angular 2 组件,它有一个 _model 对象。然后在模板中我们有这个:
<form>
<input type="text" class="form-control" required [(ngModel)]="_model.firstName" ngControl="test2" #myInput >
<br>Class: {{myInput?.className}}
</form>
_model 从一开始就可以在 ngOnInit() 中从头开始创建。输入字段已正确填充 _model.firstName 变量和以下行:
<br>Class: {{myInput?.className}}
在模板中正确呈现以下内容:
Class: form-control ng-untouched ng-pristine ng-invalid.
到目前为止一切顺利。让我困惑的是,当我添加 *ngIf 并将输入字段更改为
<input *ngIf="_model" type="text" class="form-control" required [(ngModel)]="_model.firstName" ngControl="test2" #myInput >
双花括号插值停止工作,因为显然本地 myInput 变量没有被初始化,即使代码中没有其他任何更改,_model object 仍然在 onNgInit() 中创建并且输入字段仍在工作适当地。 {{myInput?.className}} 唯一呈现的是
Class:
有人可以解释发生了什么和/或为我指出正确的文档吗?
编辑:
这是一个Plunker,显示了相关问题。
【问题讨论】:
-
你的 _model 是布尔值吗?
-
刚刚在我的应用程序中测试过,我可以重现您的问题。在您添加
*ngIf后,不知何故#myInput得到undefined。这感觉像是一个 angular2 错误,或者必须有人想出一个很好的解释。 -
不过,您可以使用
@ViewChild('myInput') myInputRef : ElementRef;和Class: {{myInputRef?.nativeElement?.className}}来获取元素,但这感觉不太合适 -
@GünterZöchbauer 假设我们使用
ngFor指令而不是ngIf,命名一个元素并在ngFor上下文之外使用该名称是没有意义的(因为可能多个具有该名称的元素)。这里也是如此,考虑following,元素的名称在结构指令的上下文中可用,但不在它之外。这是有道理的,因为 Angular 无法知道特定指令是否会重复他的模板。 -
@tchelidze 听起来像是解释
标签: angular interpolation