2013-08-01 18 views
7

Bir sayfada birden çok kez kullanıyorum yönergelerine sahibim. Durum değiştiğinde bir olay tetikler ve denetleyici olayı işler. Sorun, olayın iki kez ateşlenmesidir. Bunun neden olduğunu anlıyorum, ancak bir çözüm veya daha iyi bir tasarım bulmaya çalışıyorum. Herhangi bir ipucu?Çoklu yönerge örnekleri ve olaylar

Plunker örnek: http://plnkr.co/edit/xObOvi253qejphU5arFr

+0

Her yönerge ana kapsamın 'foo' özelliğini değiştirmeli mi? Değilse, direktifinize 'kapsamı: true 'ekleyin ve sonra her biri kendi' foo' özelliğine sahip olacaktır (ve sadece bir olay patlayacaktır). –

+1

Siz plunker'da, tüm elemanlar aynı $ kapsamını paylaşır, neden doğrudan ana denetleyicide $ watch kullanmıyorsunuz? – DotDotDot

cevap

7

Sen yönerge yeniden kullanılabilir kılınması izole kapsamını tanımlamak gerekir. Basit bir düzeltme, her bir düğmeyi tıkladığınızda, yalnızca bir kez ateşlenerek izole bir kapsam oluşturmak için scope: {} eklemektir.

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

Ah ... Bunu özledim. Teşekkürler! Şimdi sorun benim örneğimi oluştururken, kapsamımın aslında $ location.search(). Foo' aracılığıyla paylaşıldığını unutmuşum. Bu paylaşımı gerçekten istiyorum; Sadece paylaşılmış olan kapsamın kendisi olduğunu düşündüm (yani, $ location ile değil). Bu yüzden cevabım denetleyiciyi bir servise dönüştürmek olabilir ... –

+0

@JasonCapriotti Bu mantıklı. – zsong

+2

Refactored plunk, direktifin denetleyicisinden ziyade serviste depolanmış halde. Http://plnkr.co/edit/wwwp3y –