【问题标题】:Angular2 - Error with two-way binding: Expression has changed after it was checkedAngular2 - 双向绑定错误:检查后表达式已更改
【发布时间】:2017-02-01 12:22:11
【问题描述】:

我正在尝试创建一个简单的组件来输入文本。 但是当它的值发生变化时,发生了错误。

我已经查看了一些关于此错误的文章。 其中一位说“应该使用 enableProdMode()”。 这当然是对的,但我认为这不是必要的解决方案。

请告诉我一个比 enableProdMode() 更好的解决方案。

@Component({
    selector: 'text-input',
    template: '<input type="text" [(ngModel)]="value"/>',
    inputs: [
        'value'
    ]
})
export class TextInput implements DoCheck {
    @Input() value: string;
    @Output() valueChange: EventEmitter<string> = new EventEmitter();

    ngDoCheck(): void {
        console.log(`ngDoCheck: value=${this.value}`);
        this.valueChange.emit(this.value);
    }
}

-

@Component({
    template: `
        <h1>Input Components</h1>
        <h2>Text Input</h2>
        <div>
           <text-input [(value)]='textValue'></text-input>
        </div>
        <div>{{textValue}}</div>`
})
export class InputsPage {
    textValue: string = 'Hello World';
}

【问题讨论】:

  • 我认为您只需要像这样从输入中删除括号:&lt;text-input [value]="textvalue"&gt;&lt;/text-input&gt;。我认为发生错误是因为不应该有双向数据绑定。
  • @alexkucksdorf 这里的重点是双向绑定能够在子级发生更改时通知父级。所以这里需要双向绑定:)

标签: angular


【解决方案1】:

您不需要为此使用DoCheck,如果您只想在发生更改时通知父级,请改用ngModelChange 并发出值。所以加ngModelChange

<input type="text" [(ngModel)]="value" (ngModelChange)="emitValue()"/>

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

emitValue(): void {
    this.valueChange.emit(this.value);
}

你应该一切都好!希望这会有所帮助!

【讨论】:

  • 感谢您的建议。这对我来说很有用。那是很大的帮助!
  • 不客气,很高兴为您提供帮助! :) 如果这个答案解决了你的问题,你介意通过点击答案投票下的灰色勾号来接受这个答案吗,这里有更详细的说明如何做到这一点:meta.stackexchange.com/a/5235 :)
  • 对不起,我没有理解规则。我点击它以标记它已关闭。感谢您告诉我如何在 stackoverflow 上表现。
  • 绝对没问题。这不是要求采取的行动,但它会将问题和问题标记为已解决,以便其他人知道。但是感谢和快乐的编码! :)
猜你喜欢
  • 2017-12-01
  • 2017-06-08
  • 2016-06-13
  • 2017-06-26
  • 2018-05-11
  • 2017-06-23
  • 2018-06-17
  • 2019-05-14
  • 2019-01-13
相关资源
最近更新 更多