2015-01-14 79 views
0

我有一個表單,我的意圖是不要總是強制執行必填字段。例如,如果用戶將文檔保存爲草稿,則他們可以輸入儘可能少的信息,如果他們嘗試發佈文檔,則必須輸入所有必填字段。我在控制器上使用布爾值,該布爾值根據按下哪個按鈕而改變,例如,使用變量ng-required不重新評估字段

<input type="text" ng-model="field2" ng-required="enforceRequired" /> 

的問題是,該字段沒有布爾變化,使表單提交時重新評估,然後將它變爲無效。請see this JSFiddle看看我的意思。如果填寫field1然後點擊發布,它將在第一次點擊後成功,然後THEN變爲無效。

如何在提交表單之前強制執行驗證?

回答

1

Yarons是正確的,你正在改變的價值爲時已晚,遲到我的意思是表格驗證已經運行。作爲解決方法,您可以做的是在更改required值後,讓角度執行另一個循環,然後顯示警報。這可以通過$timeout服務完成,但我必須指出,更改摘要操作的流程通常不是一個好習慣。它很快就會變得非常混亂。

更改發佈這樣的功能(不要忘記注入$超時)

$scope.publish = function() { 
    $scope.enforceRequired = true; 

    $timeout(function() { 
     if ($scope.form.$valid) { 
      alert("Published!"); 
     } 
    }); 
}; 

工作小提琴:http://jsfiddle.net/bh9q00Le/14/

+0

我最終使用這個解決方案。謝謝 – user3546309

+0

這是我能找到的最佳解決方案。謝謝! –

1

的問題是,你正在改變的enforceRequired值在digest循環的中間,因此觀察家不重新呈現你檢查輸入字段的有效性(閱讀消化here)前。

如果你想避開它,我建議以下方法之一:

  1. 變化enforceRequired值調用saveDraftpublish之前。見example

  2. 在更改enforceRequired的值後,致電$scope.$apply()。見another example

+0

$範圍$適用()對我來說是最好的解決方案。非常感謝。 – user3546309

+0

我實際上剛剛注意到這會導致控制檯中的錯誤(錯誤:$應用已在進行中)。有沒有辦法解決? – user3546309

+0

我不認爲有解決辦法。你可以使用[安全申請](http://stackoverflow.com/questions/12729122/prevent-error-digest-already-in-progress-when-calling-scope-apply),但它會導致整個解決方案不工作...這就是爲什麼我建議另一種方法。 – yarons