Ответ 1
Вы вызываете директиву три раза, один раз для каждой кнопки. AFAIK это означает, что функция связывания называется три раза, связывая события и наблюдая за изменениями. добавлено немного подробнее об этом ниже.
Прекрасно менять DOM при изменении моделей, но то, что вы делаете - изменение классов и значений - может выполняться автоматически с помощью angular с использованием двунаправленных привязок к данным и родных директив, таких как ng-class
Вы можете создать директиву, которая отображает кнопки с указанием списка параметров. Например, если у вас есть эта модель и эти параметры
$scope.myOptions = ["Left", "Middle", "Right"];
$scope.myModel = "Left"
Вы можете создать директиву buttons-radio
, подобную этой
App.directive('buttonsRadio', function() {
return {
restrict: 'E',
scope: { model: '=', options:'='},
controller: function($scope){
$scope.activate = function(option){
$scope.model = option;
};
},
template: "<button type='button' class='btn' "+
"ng-class='{active: option == model}'"+
"ng-repeat='option in options' "+
"ng-click='activate(option)'>{{option}} "+
"</button>"
};
});
который можно вызвать из вашего HTML
<buttons-radio class="btn-group" data-toggle="buttons-radio"
model='myModel'
options='myOptions'>
</buttons-radio>
Замечания:
- В шаблоне используется директива
ng-repeat
, которая проходит через все опции и компилирует соответствующие кнопки. - Директива имеет свой собственный контроллер и изолированную область с
model
иoptions
для принятия двунаправленного связывания, поэтому angular делает свою магию, когда директива изменяет свои значения. - Если опция соответствует текущему значению модели, то кнопке присваивается класс
active
. - При нажатии кнопки вызывается метод
activate
(из контроллера директив) и изменяется значение модели.
Heres a JSFiddle http://jsfiddle.net/jaimem/A5rvg/4/
ИЗМЕНИТЬ
Я не был полностью уверен в этом, но да, у вашей модели будут три разные наблюдатели, по одному для каждого вызова директивы. Если вы используете Batarang, вы можете увидеть все просмотренные выражения на вкладке "Производительность" и панели "Угловые атрибуты". Batarang также предоставляет удобное свойство $scope
, поэтому вы можете искать свои объекты для просмотра модели, запустив следующее с консоли
$scope.$$watchers.filter(function(w){return w.exp ==="myModel['A']"});