2014-01-13 66 views
16

DEMO

爲什麼在下面的例子中,當點擊按鈕時不會調用$render

<input type="text" ng-model="client.phoneNumber" phone-number> 
<button ng-click="client.phoneNumber='1111111111'">Change phone number</button> 
.directive("phoneNumber", function() { 
    return { 
    restrict: 'A', 
    require: 'ngModel', 
    link: function(scope, element, attrs, ngModel) { 
     ngModel.$render = function() { 
     alert('rendering'); // This is not called 
     }; 
    } 
    }; 
}); 

回答

31

input指令的指令之後運行,因此它的$render功能取代你的。

設置你的指令的優先級大於0的值。例如:

.directive("phoneNumber", function() { 
    return { 
    restrict: 'A', 
    require: 'ngModel', 
    priority: 1, 
    link: function(scope, element, attrs, ngModel) { 
     ngModel.$render = function() { 
     alert('rendering'); 
     }; 
    } 
    }; 
}); 

而且你$render將優先考慮,你會看到你的警報被調用。

+1

謝謝!現在完美。 –

+0

不客氣!你可以看看Angular [輸入指令在這裏](https://github.com/angular/angular.js/blob/cdc4d485a6daa0c74e5d07d8def2a3ee68d93d13/src/ng/directive/input.js) - 它可以幫助你瞭解它的使用方法'$ render' – KayakDave

+0

工程,調用'渲染',但輸入文本失去它的價值:它變成空的。任何想法爲什麼? – Laurent

1

ngModel.$render正在工作,在$apply中調用。

app.directive('changecase', function ($timeout) { 
 
    return { 
 
    restrict: 'A', 
 
    require: 'ngModel', 
 
    priority: 1, 
 
    link: function (scope, element, attrs, ngModel) { 
 
     
 
     //format text going to user (model to view) 
 
     ngModel.$formatters.push(function(value) { 
 
      return value.toUpperCase(); 
 
     }); 
 

 
     //format text from the user (view to model) 
 
     ngModel.$parsers.push(function(value) { 
 
      return value.toUpperCase(); 
 
     }); 
 

 
     element.on('blur keyup change', function() { 
 
      scope.$apply(function(){ 
 
       ngModel.$setViewValue(ngModel.$modelValue); 
 
       ngModel.$render(); 
 
      }); 
 
      }); 
 
     } 
 
    } 
 
});

相關問題