我自己做了一個自定義驗證器,它的工作原理與我想要的一樣AngularJS 1.2
但現在我想升級到1.3
的最新且幾乎穩定的版本,但調試有一段時間我發現它不能按預期工作,因爲我使用$timeout
和ctrl.$setValidity
。我原來和工作代碼(當然這僅僅是實際代碼的一個子集)如下:
var validator = function(value) {
// invalidate field before doing any validation,
// so that it's invalid before typing timeout has time to finish and execute
ctrl.$setValidity('validation', false);
$timeout.cancel(timer);
timer = $timeout(function() {
var isValid = validate(value);
ctrl.$setValidity('validation', isValid);
}, 1500);
return value;
}; // end of validator()
// attach the Validator object to the element
ctrl.$parsers.unshift(validator);
ctrl.$formatters.unshift(validator);
我手動更改$setValidity
到false
,因爲我想確保用戶前,將不會發布形式該字段實際上已經完成驗證。只有超時才能讓用戶在打字完成後(或至少在1.5秒後停止輸入)才顯示錯誤(如果有),從而爲用戶帶來更流暢的體驗。在1.5秒的超時完成後,validate(value)
開始並且應該更新$setValidity
爲true或false ...這在AngularJS 1.2
中完全正常,但完全沒有在1.3
中。即使我自己手動設置$setValidity
到true
它不起作用,實際上停留在false
狀態,但如果我刪除$timeout
包裝,那麼它工作正常......但我真的需要並希望我的超時工作!
爲了參考的角度來看,我的自定義驗證器是免費提供給任何人在這Github link
任何幫助,非常感謝。
編輯
在@SKYWALKR(感謝您的幫助)的幫助下,我進一步調試了我的問題,它實際上比我之前描述的要多得多。我的問題似乎實際上涉及到一堆東西在一起,ng-model
綁定裏面ng-repeat
執行一個自定義驗證程序有問題只有如果我啓用$timeout
...現在所有的一起,綁定不能正常工作,哇,我花了一段時間爲此建立一個適當的測試案例。因此,這裏是我的問題的樣本:
plunker
當您運行在第一個樣品,你會看到,沒有任何輸出中的:{{結合}}在工作(它假設顯示所鍵入的正下方它)它不起作用,但如果你註釋掉var timer
和$timeout
(註釋掉第39,42和44行),然後再運行它,現在它可以工作......那麼爲什麼?什麼壞了?
嗯是的,你是對的,它的工作..我可能會在錯誤的方向已經看過。相反,問題看起來更像綁定,'ng-model'不會在控制器中返回我的值。所以基本上我有我的自定義驗證器,並且一旦它完成驗證,就會執行一個'ng-change'事件,然後從那裏獲取ng-model的值,但是如果我刪除'$ timeout',它將返回'undefined'確實像往常一樣獲得價值......即使在你的遊戲中,我也無法獲得屏幕上的綁定。對不起,您知道調試世界:S – ghiscoding 2014-09-06 05:08:39
非常感謝您的幫助,我分叉您的闖入者,並創造出我的實際問題的另一個大野獸。我編輯了我的問題,這是一個比我預期的更大的問題..請幫助! – ghiscoding 2014-09-06 05:47:20