angular2 ngModel,其值来自@Input

时间:2017-04-21 12:23:12

标签: angular typescript angular2-forms

我试图在我的子组件中使用[(ngModel)],并通过@Input()从我的父组件传递到我的子组件中。

然而,双向绑定似乎不起作用。字符串正确地从父项传入,但是当我在子项中编辑它时父项的值不会更新。

我错过了什么?

父:

@Component({
  selector: 'my-app',
  template: `
    <div>
      <child [(value)]="name"></child>
      <p>{{name}}</p>
    </div>
  `,
})
export class App {
  name:string = 'MyValue';
  constructor() {

  }
}

import {Component, Input} from '@angular/core'

@Component({
  selector: 'child',
  template: `
    <div>
    <p>My custom input</p>
      <textarea [(ngModel)]="value"></textarea>
    </div>
  `,
})
export class Child {


  @Input() value:string;

  constructor() {

  }
}

我创建了一个plnkr来说明问题:https://plnkr.co/edit/jCF5kt73P38EFYUAZF6l

3 个答案:

答案 0 :(得分:6)

您需要输出来通知更改:

import {Component, Input} from '@angular/core'

@Component({
  selector: 'child',
  template: `
    <div>
    <p>My custom input</p>
      <textarea [(ngModel)]="value" (ngModelChange)="update($event)"></textarea>
    </div>
  `,
})
export class Child {


  @Input() value:string;
  @Output() valueChange:EventEmitter<string> = new EventEmitter<String>()

  update(value) {
    this.valueChange.emit(value);
  }

  constructor() {

  }
}

答案 1 :(得分:0)

是的 - @Input只能单向工作。当父级更改Input的值时,子级会收到通知。但是,如果您使用@Input,则父级不会意识到对该子级的任何更改。

答案 2 :(得分:0)

继续@GünterZöchbauer回答我也修改了app.ts文件。

app.ts:

true

//our root app component
import {Component, NgModule, VERSION} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import {Child} from './child'
import {FormsModule} from "@angular/forms";

@Component({
  selector: 'my-app',
  template: `
    <div>
      <child [value]="name" (valueChange)= "updateValue($event)"></child>
      <p>{{name}}</p>
    </div>
  `,
})
export class App {
  name:string = 'MyValue';
  constructor() {

  }
   updateValue(value){
      this.name = value;
    }
}

@NgModule({
  imports: [ BrowserModule, FormsModule ],
  declarations: [ App, Child ],
  bootstrap: [ App ]
})
export class AppModule {}