2016-07-13 154 views
0

假設我們有一個自定義驗證器,其輸入爲屬性的值。自定義驗證器範圍更改的觸發器驗證

app.directive('inputRequired', function() { 
    return { 
     require: 'ngModel', 
     scope: { 
      inputRequired: '=' 
     }, 
     link: function(scope, elm, attrs, ctrl) { 
      ctrl.$validators.inputRequired = function(modelValue) { 
       return !(scope.inputRequired && ctrl.$isEmpty(modelValue)); 
      }; 
     } 
    }; 
}); 

在範圍內,我們定義一個變量和函數來切換變量的值:

$scope.isRequired = false; 

$scope.toggle = function() { 
    $scope.isRequired = !$scope.isRequired; 
}; 

然後我們創建一個表單,我們將使用自定義的驗證。我們也添加一個按鈕來調用切換功能。

<form> 
    <input type="text" ng-model="someModel" input-required="isRequired"/> 
    <button ng-click="toggle()">toggle</button> 
</form> 

這應該如何工作?當窗體被加載並且範圍被初始化時,isRequired的值被設置爲false。所以輸入字段不是必需的。當我們點擊切換按鈕時,isRequired的值更改爲true。但!雖然驗證器作用域上的變量已更改,但未觸發驗證。

重要提示:這只是一個例子。我知道ng-required指令,它實現了這個功能。我需要一個通用的解決方案,當一個驗證器有一個輸入和字段的有效性取決於該輸入。如果輸入更改,則該字段必須立即重新生效。

回答

1

只是找到了一個解決方案:添加鏈接中的功能範圍觀察者,並調用$驗證時inputRequired變化:

app.directive('inputRequired', function() { 
    return { 
     require: 'ngModel', 
     scope: { 
      inputRequired: '=' 
     }, 
     link: function(scope, elm, attrs, ctrl) { 
      ctrl.$validators.inputRequired = function(modelValue) { 
       return !(scope.inputRequired && ctrl.$isEmpty(modelValue)); 
      }; 

      scope.$watch("inputRequired", function() { 
       ctrl.$validate(); 
      }); 
     } 
    }; 
});