2013-12-10 136 views
1

我做了這個指令來驗證號碼,如果它是在一個範圍:AngularJs確認指令不更新模型

app.directive('nkNumber', function(){ 
    return { 
    scope: { 
     max: '=nkMax', 
     min: '=nkMin' 
    }, 
    require: 'ngModel', 
    restrict: 'A', 
    link: function($scope, iElm, iAttrs, controller) { 
     function validate(value){ 
     if (angular.isDefined(value)){ 
      value = parseInt(value); 
      if ($scope.max){ 
      var max = parseInt($scope.max); 
      controller.$setValidity('nkMax', value < max) 
      } 
      if ($scope.min){ 
      var min = parseInt($scope.min); 
      controller.$setValidity('nkMin', value > min) 
      } 
     } 
     return value; 
     } 
     controller.$parsers.push(validate); 
     controller.$formatters.push(validate); 
    } 
    }; 
}); 

驗證工作正常,但是當我改變數值沒有更新我的模型在輸入。

這是怎麼發生的?我該如何解決它?

+1

哪裏/爲什麼/如何更新模型?驗證確實有效:http://plnkr.co/edit/PWOL8zyFDnpiLDuFnjrn?p =預覽,但是請你解釋一下預期的行爲是什麼? –

+0

mmm它的工作原理...這是Angular版本將其更改爲「1.0.3」,它停止工作...我使用的是「1.0.5」... http://plnkr.co/edit/ qRc8JClqCc5DFTjigrxL?p =預覽 – rascio

回答

4

您可能正在使用1.2.x之前的角度版本。較舊版本的角度處理隔離範圍不一致,通常會將其他指令吞入隔離範圍。這就是你的情況。

ng模型正在作用於您的nk-number指令的隔離範圍,因此它正在將其值寫入該專用範圍而不是外部範圍。

如果您使用1.2.x版本的angular,隔離範圍不會像這樣混合,所以事情應該按預期工作。

如果您希望保留較舊版本的角度,則修復方法是不針對此特定指令使用隔離範圍。

一般來說,使用隔離範圍幾乎總是一個壞主意,除非您的指令具有模板。如果您的指令沒有自己的模板,那麼隔離範圍的使用幾乎沒有任何理由,並可能導致您所看到的那類問題。

這裏是不分離的範圍寫你的指令的一個例子:

app.directive('nkNumber', function($parse){ 
    return { 
    require: 'ngModel', 
    restrict: 'A', 
    link: function($scope, iElm, iAttrs, controller) { 

     function validate(value){ 
     var max = $scope.$eval(iAttrs.nkMax); 
     var min = $scope.$eval(iAttrs.nkMin); 

     if (angular.isDefined(value)){ 
      value = parseInt(value); 
      if (max){ 
      max = parseInt(max); 
      controller.$setValidity('nkMax', value < max) 
      } 
      if ($scope.min){ 
      min = parseInt(min); 
      controller.$setValidity('nkMin', value > min) 
      } 
     } 
     return value; 
     } 
     controller.$parsers.push(validate); 
     controller.$formatters.push(validate); 
    } 
    }; 
}); 

通知,沒有分離的範圍,你需要在nkMaxnkMin屬性使用$scope.$eval()

這實際上是編寫此指令的更好方法,並且可以在所有角度版本中工作。