2014-01-14 39 views
8

我需要將ng-form設置爲無效,因爲它是嚮導的後面部分。該表單包含一個包含元素的網格。每個元素都有自己的驗證,但問題是當沒有元素時,表單顯示爲有效。當行數爲0時,我需要將它標記爲無效。如何做到這一點?設置窗體在angularjs中無效

+0

可能重複[Angularjs:如何手動設置輸入$控制器中有效?](http://stackoverflow.com/questions/15437435/angularjs-how-do-i-manually-set-input-to在控制器中有效) –

+1

如果該問題沒有標記答案,並且提供了一個不可能做到的狀態,那該如何重複?雖然這顯然是可以做到的,我在答案中證明了這一點。這就是爲什麼這個問答在這裏。所以人們可以找到。 – stride

回答

18

經過一番研究,下面的代碼對我來說工作的很好。在控制器中:

//Set the form as invalid for start. 
    $timeout(function(){ 
    $scope.orderForm.productsForm.$invalid = true; 
    }); 

超時確保我們可以訪問表單。它們不是在第一次通過控制器時建立的,所以需要超時或監視。 然後我們將表單標記爲無效。更好的方法是找到一個輸入,我們可以使用ngModelController上的記錄的API $setValidity標記爲無效,但在我的用例中沒有輸入,所以我們用一種骯髒的方式來做。

一個需要注意的是,當一個人直接像上面那樣設置$ invalid ===! $有效不變被破壞,所以要小心這個黑客。

1

我認爲以下是一個更清潔的解決方案。

$scope.$watch('myForm', function (a, b) { 
    $scope.myForm.$setValidity('custom', false, window); // 'custom' validation key, binds window as form control 
}); 

我喜歡$watch更好;最初,我要檢查「表單是否已經創建」,然後才設置有效性。

但它似乎並不是真的需要,表單是在$ watch執行初始時間之前創建的(所以不需要更改)。

$setValidity似乎是ngForm API的一部分(我在form.js源代碼中發現它),它被表單控件自己使用,它們都設置$ valid和$ invalid。