2016-06-23 4 views
1

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

Это то, что моя директива выглядит следующим образом:

myApp.directive('searchBox', ['$interval', function($interval) { 
    return { 
     restrict: 'A', 
     link(scope, element, attrs) { 
      $interval(function() { 
       attrs.placeholder = 'New'; 
      }, 1000); 
     } 
    } 
}]) 

И в HTML:

<input type="text" class="form-control" placeholder="Old" ng-model="search" search-box> 

Однако заполнитель упорно не меняется, даже если в консоли attrs.placeholder можно увидеть изменения to 'Test' из 'Hello'. Есть идеи?

PLUNKR: https://plnkr.co/edit/Oy1M8FPTXxzB9oYMJqlx?p=preview

ответ

2

Вы не можете изменять значения атрибутов с помощью attr объекта (это просто статическое отражение вашего атрибутов элементов). Вместо этого обновите свой элемент, используя element.attr('placeholder', 'Test') или attrs.$set('placeholder', 'Test').

+1

Пусть вы и ваши дети будете благословлены навеки. – Aron

+0

В чем разница между этими двумя методами? – Aron

+0

Посмотрите сами: https://github.com/angular/angular.js/blob/b94626cb9bc03a067feb7c6f0302f811edfd8e67/src/ng/compile.js#L1537 В принципе, 'attrs. $ Set' позволяет вам использовать интерполяцию в вашем значении (например, 'attrs. $ set ('placeholder', 'Test {{myVar}}')', а ключ атрибута «нормализован» à-la-Angular, что означает обновление атрибута 'data-foo', который вы бы используйте 'dataFoo' как ключ ' element.attr' - это просто регулярное обновление атрибута DOM. – Iso

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