2013-08-01 5 views
7

私は、ページ上で複数回使用するディレクティブを持っています。状態が変わるとイベントが発生し、コントローラがそのイベントを処理します。複数のディレクティブインスタンスとイベント

問題は、イベントが2回発生することです。私はこれがなぜ起こるのかを知るが、回避策やより良いデザインを見つけようと努力している。任意のヒント?

Plunker例:http://plnkr.co/edit/xObOvi253qejphU5arFr

+0

各ディレクティブで親スコープの 'foo'プロパティを変更する必要がありますか?そうでなければ、あなたのディレクティブに 'scope:true'を追加するだけで、それぞれが独自の' foo'プロパティを持ちます(ただ一つのイベントだけが起動します)。 –

+1

plunkerでは、すべての要素が同じ$スコープを共有しています。なぜ、メインコントローラで$ watchを直接使用しないのですか? – DotDotDot

答えて

7

あなたはディレクティブの再利用可能なを作るために分離された範囲を定義する必要があります。単純な修正では、scope: {}を追加して隔離されたスコープを作成するので、各ボタンをクリックすると1回だけ実行されます。

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

私のリファクタリングされたplunkは、ディレクティブのコントローラーではなくサービスの状態で保存されています.. http://plnkr.co/edit/wwwp3y –