1

我自己做了一個自定義驗證器,它的工作原理與我想要的一樣AngularJS 1.2但現在我想升級到1.3的最新且幾乎穩定的版本,但調試有一段時間我發現它不能按預期工作,因爲我使用$timeoutctrl.$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); 

我手動更改$setValidityfalse,因爲我想確保用戶前,將不會發布形式該字段實際上已經完成驗證。只有超時才能讓用戶在打字完成後(或至少在1.5秒後停止輸入)才顯示錯誤(如果有),從而爲用戶帶來更流暢的體驗。在1.5秒的超時完成後,validate(value)開始並且應該更新$setValidity爲true或false ...這在AngularJS 1.2中完全正常,但完全沒有在1.3中。即使我自己手動設置$setValiditytrue它不起作用,實際上停留在false狀態,但如果我刪除$timeout包裝,那麼它工作正常......但我真的需要並希望我的超時工作!
爲了參考的角度來看,我的自定義驗證器是免費提供給任何人在這Github link

任何幫助,非常感謝。

編輯
在@SKYWALKR(感謝您的幫助)的幫助下,我進一步調試了我的問題,它實際上比我之前描述的要多得多。我的問題似乎實際上涉及到一堆東西在一起,ng-model綁定裏面ng-repeat執行一個自定義驗證程序有問題只有如果我啓用$timeout ...現在所有的一起,綁定不能正常工作,哇,我花了一段時間爲此建立一個適當的測試案例。因此,這裏是我的問題的樣本:

plunker

當您運行在第一個樣品,你會看到,沒有任何輸出中的:{{結合}}在工作(它假設顯示所鍵入的正下方它)它不起作用,但如果你註釋掉var timer$timeout(註釋掉第39,42和44行),然後再運行它,現在它可以工作......那麼爲什麼?什麼壞了?

回答

1

您的正確,1.3是不穩定的版本。您的指令使用1.3.0-rc.0正常工作...請參閱下面的plunkr。

http://embed.plnkr.co/GSU2Ldn0D2YM0aD9PQla/preview

+0

嗯是的,你是對的,它的工作..我可能會在錯誤的方向已經看過。相反,問題看起來更像綁定,'ng-model'不會在控制器中返回我的值。所以基本上我有我的自定義驗證器,並且一旦它完成驗證,就會執行一個'ng-change'事件,然後從那裏獲取ng-model的值,但是如果我刪除'$ timeout',它將返回'undefined'確實像往常一樣獲得價值......即使在你的遊戲中,我也無法獲得屏幕上的綁定。對不起,您知道調試世界:S – ghiscoding 2014-09-06 05:08:39

+0

非常感謝您的幫助,我分叉您的闖入者,並創造出我的實際問題的另一個大野獸。我編輯了我的問題,這是一個比我預期的更大的問題..請幫助! – ghiscoding 2014-09-06 05:47:20