我在使用Angular 2ngModel绑定时遇到了一个问题。plnkr公司
如果我使用ngModel将值绑定到子组件,则该值不会填充到子组件的OnInit函数上。因此,如果我绑定到一个属性调用“边界名称”,并尝试在OnInit中访问它,它将为空。但是,如果我不使用ngModel而是使用输入参数将其绑定到父控件中的相同值,则可以在OnInit函数中访问该值。
因此..如果我的父组件创建了一个子组件
<my-boundcomp [(ngModel)]="name" [(inputName)] ="name" ></my-boundcomp>
我在Init函数上子组件是
public ngOnInit() {
console.log("Input Name :" + this.inputName);
console.log("Bound Name :" + this.boundName);
this._boundNameOnInit = this.boundName; // <--- Going to be null
this._inputNameOnInit = this.inputName; // <--- Going to be not null
}
我发现这种行为很奇怪,而且出乎意料。我不确定这是一个错误还是我没有正确使用FormsModulengModel,但足够有趣,我认为我应该分享。
这是完整的 plnkr https://plnkr.co/edit/Im5oz7q1HhG5MgGTTZ1R?p=preview
我认为,如果在使用ControlValueAccessor时依赖于通过writeValue设置的值,这是一个“问题”。由于设置了boundName并且ngOnInit是首先触发的事件之一,所以writeValue还没有机会运行。
我尝试在其他一些生命周期钩子(AfterViewInit、AfterContentInit)上添加这个,现在还为时过早。事实上,如果您将边界名称默认为“”或其他内容,您会注意到在AfterViewInit或AfterContentInit中,它实际上在调用写值之前被空掉了。
出于这个原因,我建议在写值方法中设置您的值。如果您需要只设置一次,您可以使用标志。请参阅下面的代码…
export class BoundValueComponent implements OnInit, ControlValueAccessor {
@Input() inputName: string;
boundName: string;
private _boundNameOnInit : string;
private _inputNameOnInit : string;
private initialized: boolean = false;
private onTouchedCallback: () => void = noop;
private onChangeCallback: (_: any) => void = noop;
constructor() {
}
public ngOnInit() {
console.log("Input Name :" + this.inputName);
console.log("Bound Name :" + this.boundName);
// this._boundNameOnInit = this.boundName; // <--- Going to be null
this._inputNameOnInit = this.inputName; // <--- Going to be not null
}
get value(): any {
return this.boundName;
};
/**
* Set accessor including call the onchange callback.
*/
set value(v: any) {
if (v !== this.boundName) {
this.boundName = v;
this.onChangeCallback(v);
}
}
/**
* From ControlValueAccessor interface.
*/
writeValue(value: any) {
this.boundName = value;
if (!this.initialized) {
this._boundNameOnInit = this.boundName;
this.initialized = true;
}
}
.......
这个代码
[(ngModel)]="name"
将OnInit
中的NgModel
的值设置为BoundValueComponent
的值。当从NgModel
调用BoundValueComponent.write值
时,则设置边界名称
。
我很确定这是设计好的。
问题内容: 好了,到目前为止我是能够成功地结合,与ngModel通过使用自定义他们的每一个。现在我处于 这种情况,我可以捕获纸张下拉菜单(iron-select),但不能绑定双向,即使用下面的ngModel是HTML和自定义访问器类 我的form.html 和我的自定义访问器类 问题答案: 完整的工作示例。我没有找到应用合适的方式来,而是将其添加到embeeded 。唯一的缺点是,如果您对使用了不
我有一个要求,我需要将电话号码绑定到ngModel,只要它存在。我的代码如下: 如果电话号码存在,这很好,但如果不存在,我得到以下错误: 无法读取未定义的属性“full_number” 因此,基于这个SO帖子链接,我尝试了以下内容: 但是,这会导致语法错误。 未捕获错误:模板解析错误 解决此问题的一种方法是使用并再次重复代码集。但是,我应该做些什么来进行内联操作,比如三元条件检查?
因此,我在这里询问绑定表的概念。通常,只需对所有行/列使用ngFor即可。 然而,我想做的是,对于每个单元格,它应该绑定到一个具有两个属性的对象: <李>细胞内容李< / ><李>坳的头 在我的表中,我应该能够根据需要添加行或列。这很简单,但所有共享column_header的单元格都是棘手的部分。 现在这个表代表一个表单,所以我可以在用户单击submit后进行处理并解决问题。 我只是寻找其他聪明
组件如下: 以下是规范: 我肯定我错过了一些基本的/简单的东西,但我花了过去一天的时间梳理了所有我能找到的东西,没有运气。
组件: 表单: 该函数更新一个JSON记录。例如,它用“fname”ng model更新“firstName:”条目。问题是,除非用户修改输入的值,否则ngModel被读取为null,即使已经存在< code > value = " { { current user . first name } } " 的值。 如何设置 ngModel 以从实际输入的值其值?
本文向大家介绍详解Angular Forms中自定义ngModel绑定值的方式,包括了详解Angular Forms中自定义ngModel绑定值的方式的使用技巧和注意事项,需要的朋友参考一下 在 Angular 应用中,我们有两种方式来实现表单绑定——“模板驱动表单”与“响应式表单”。这两种方式通常能够很好的处理大部分的情况,但是对于一些特殊的表单控件,例如 input[type=datetime