ngDoCheck是你的問題,這裏是原因:
ngDoCheck會在模型內部發生更改後觸發。
在您鍵入的字母后,角度開始檢查到處(整個應用程序)是否有任何相關的更改,並且Angular在更改後僅運行更改檢測一次,並且此後不應該有任何更新。雙向數據流,一個檢查)。
假設成功執行了更改檢測(ngDoCheck)並相應地更新了UI,但在檢查過程中,您突然做出了另一項更改。
在開發模式,Angular2運行的第一個又一個changeDetection以確保沒有任何的第一個後已經改變了,因爲你發出的事件,可以改變模型再次悄無聲息,棱角分明是生氣,會拋出錯誤。
但是,在產品模式,Angular將不會運行第二次檢查,因此您不會在生產中看到此錯誤,但您的模型更新(emit)不會反映在UI中。 ,只需將ngCore.enableProdMode();
添加到您的main.ts
文件中,錯誤消失)。
下面是幾種方法來解決這個問題:
1-改變你的策略,就像在我First Plunker,你可以簡單地使用對象的綁定並繞過這個問題。
2-推遲了的setTimeout您的更改,這將運行另一個變化檢測,使角高興:
ngDoCheck(){
setTimeout(()=>{
this.bindingPropertyChange.emit(this.bindingProperty)
});
}
這裏是plunker
3-不要使用ngDoCheck,放出你的變化另一個使用(輸入)或(鍵盤)或類似事件的循環,這又使Angular運行另一個變化檢測:
注意我建議使用(輸入) up或keydown或類似的,原因是如果你使用keyup/keydown,更新不會是無縫的,因爲如果你按下一個鍵並按住它,更新將不會發生,直到你釋放鍵,但是(輸入),它會立即發生,就像你在評論中說的,如果用戶要用鼠標複製粘貼,他們沒有使用密鑰,也不會更新模型。
<input [(ngModel)]="bindingProperty" (input)="emitUp()" class="form-control"/>
emitUp(){
this.bindingPropertyChange.emit(this.bindingProperty)
}
這裏是Plunker
我可以建議其他辦法做到這一點? – micronyks
當然,我想能夠使用2種方式綁定這個控制。 – JamTay317
@ JamTay317,看看這個:https://plnkr.co/edit/nSymAOlvkOSdUx22gdrL?p=preview – Milad