2014-01-13 3 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

Добро пожаловать! Вы можете проверить Угловую [директиву ввода здесь] (https://github.com/angular/angular.js/blob/cdc4d485a6daa0c74e5d07d8def2a3ee68d93d13/src/ng/directive/input.js) - это может помочь многим увидеть, как она использует '$ render' – KayakDave

+0

Работает, вызывая« рендер », но входной текст при потере его значения: он становится пустым. Любая идея почему? – Laurent

1

ngModel.$render работает, когда звонит $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(); 
 
      }); 
 
      }); 
 
     } 
 
    } 
 
});

Смежные вопросы