当前位置: 首页 > 知识库问答 >
问题:

在Angular 2的OnInit中,ngModel绑定为空

彭胡媚
2023-03-14

我在使用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

共有2个答案

束雅达
2023-03-14

我认为,如果在使用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;
 }
}
.......
白才艺
2023-03-14

这个代码

[(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