2013-08-01 2 views
7

У меня есть директива, которую я использую несколько раз на странице. Он запускает событие, когда состояние изменяется, и контроллер затем обрабатывает событие.Несколько экземпляров и событий директивы

Проблема в том, что мероприятие запускается дважды. Я понимаю, почему это происходит, но я застрял, пытаясь найти обходной путь или лучший дизайн. Какие-нибудь советы?

Plunker пример: http://plnkr.co/edit/xObOvi253qejphU5arFr

+0

Должно ли каждая директива изменять свойство 'foo' родительской области? Если нет, просто добавьте 'scope: true' в свою директиву, а затем каждый из них будет иметь свое собственное свойство' foo' (и будет срабатывать только одно событие). –

+1

В вашем плунтере все элементы имеют одинаковый $ scope, почему бы вам просто не использовать $ watch прямо в главном контроллере? – DotDotDot

ответ

7

Вы должны определить изолированную область, чтобы сделать директиву для повторного использования. Простое исправление заключается в том, чтобы просто добавить scope: {}, чтобы создать изолированную область, поэтому, когда вы нажимаете на каждую кнопку, она срабатывает только один раз.

app.directive('myDirective', function() { 
    return { 
    restrict: 'E', 
    scope: {}, // Add this line to create an isolated scope 
    template: '<div>Foo: {{foo}}</div><button ng-click="incrementFoo()">Increment Foo</button>', 
    controller: function ($scope) { 
     $scope.foo = 0; 
     $scope.incrementFoo = function() { 
     $scope.foo += 1; 
     }; 

     $scope.$watch('foo', function() { 
     $scope.$emit('fooChanged', {foo: $scope.foo}); 
     console.log($scope); 
     }); 
    } 
    }; 
}); 
+0

А ... Я пропустил это. Благодаря! Теперь проблема заключается в создании моего примера. Я забыл, что моя область фактически разделяется с помощью '$ location.search(). Foo'. Я действительно хочу этого обмена; Я просто подумал, что сама сфера была разделена (т. Е. Не через $ location). Поэтому я думаю, что мой ответ может состоять в том, чтобы реорганизовать контроллер в службу ... –

+0

@JasonCapriotti Это имеет смысл. – zsong

+2

Мой рефакторированный плунж, с сохраненным в штате, а не директором контроллера. Http://plnkr.co/edit/wwwp3y –

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