2015-04-01 4 views
0

У меня есть директива элемента и директива атрибута:Как удалить директивы атрибута из директивы элемента в AngularJS?

<my-element my-attribute="value"></my-element> 

мой-атрибут является директивой, которая требует ngModel:

app.directive('myAttribute', [ 
    function() { 

     var definition = { 
      restrict: 'A', 
      require: 'ngModel', 
      link: function ($scope, $element, $attrs, ctrl) {...} 
} 
return definition; 

моего-элемент может быть использован без нг-модели, но шаблон my-element содержит вход, который всегда имеет ng-модель. My-attribute должен быть удален из my-element и добавлен к вводу внутри my-element. В моей функции компиляции в моем-элементного директивы у меня есть:

var value = element.attr('my-attribute'); 
element.remove('my-attribute'); 
element.find('input').attr('my-attribute', value); 

Это хорошо работает, когда директива атрибута не требуется: "ngModel. Но если мне требуется ngModel, я получаю:

Error: [$compile:ctreq] Controller 'ngModel', required by directive 'myAttribute', can't be found!

Почему? Как я могу это исправить?

+0

ошибка вполне очевидна или может быть я не получил вопрос – harishr

+0

My-attribute удален my-element из my-element и добавлен к вводу внутри my-element, который имеет ngModel – latata

+0

, но даже до того, как угловая заменила вашу директиву html , он будет проверять, удовлетворяет ли требуемый атрибут или нет ... и в этот момент у вас нет ng-модели в атрибутах вашей директивы ... следовательно, ошибка – harishr

ответ

2

Если у вас есть require: 'ngModel', вы получите сообщение об ошибке, если у вас нет атрибута ng-model в этом элементе, на котором установлена ​​директива, - это то, что означает это свойство директивы. В нем говорится: «Дайте мне контроллер контроллера ngModel, который будет доступен в качестве 4-го параметра в функции связи.

Чтобы избежать этого, если вам не всегда нужно его использовать, вы можете добавить знак ? перед ngModel и это означает, что это необязательно:

.... 
require: '?ngModel', 
.... 
1

Если вы хотите удалить атрибут следует использовать

element.removeAttr('my-attribute'); 

Я не уверен, о своем намерении в функции связи, но вы могли бы сделать функцию ссылки в myAttribute ru п только если есть атрибут нг-модель на элементе:

require: 'ngModel', 
compile: function(el, attr) { 
    if (attr.ngModel) { 
     return function(scope, elm, attr, ngModel) { 
      // link function 
     } 
    } 
} 

Это возможно потому, что угловой не пытается найти необходимые директивы, пока она не будет выполнять функции связи для этой директивы.

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