我有一個AngularJS應用程式,其中有一系列文本輸入元素,這些元素是使用ng-model指令系結到底層模型的資料:
<input type="text" myCustomDirective ng-model="cell.val" ng-model-options="{ updateOn: 'blur' }">
如您所見,我在輸入 ( myCustomDirective) 上也有自定義指令,該指令包括一個parser用于處理用戶鍵入的文本并將其轉換為基礎模型值formatter的將模型值格式化為文本)。
這一切正常。但是,如果用戶將一些資料粘貼到輸入中,我需要實作一個自定義粘貼功能。發生這種情況時,我需要分析粘貼的資料,并根據結果可能需要更改正在粘貼的資料,甚至將一些資料粘貼到另一個文本輸入中。
為了實作這一點,我添加了ng-paste這樣的指令:
<input type="text" myCustomDirective ng-model="cell.val" ng-model-options="{ updateOn: 'blur' }"
ng-paste="contentPasted($event)">
在處理程式內部,我進行處理,然后如果需要,我通過執行以下操作將資料“手動粘貼”到我想要的文本輸入中:
pasteEvent.preventDefault();
setTimeout(() => inputElement.focus(), 0);
setTimeout(() => inputElement.value = myData);
setTimeout(() => inputElement.blur(), 0);
呼叫focusandblur是我嘗試觸發 AngularJS 模型更新的嘗試……但是,這不起作用。文本輸入中的值正確更改(并且也由myCustomDirective格式化程式正確處理)。但是底層模型沒有更新,如果我ng-changed向元素添加指令,我會看到它沒有被呼叫。
注意:您可能會問為什么我不只是更改模型中的值并讓 AngularJS 更新輸入。答案是:因為我希望粘貼的文本由myCustomDirective指令實作的決議器處理,所以我想模擬一個“正確”的粘貼到文本框中。
uj5u.com熱心網友回復:
好的,在寫完問題后不久,我在 SO 上的另一個執行緒中找到了解決方法。基本上,如果我這樣做:
pasteEvent.preventDefault();
setTimeout(() => inputElement.focus(), 0);
setTimeout(() => inputElement.value = myData);
setTimeout(() => angular.element(inputElement).triggerHandler('input'));
setTimeout(() => inputElement.blur(), 0);
它完美地作業。
如果有人有更清潔/更“正確”的解決方案,我會暫時保留這個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/520419.html
