2013-08-01 8 views
10

ディレクティブ内でウォッチを取得する際に問題が発生しました。私はここで簡単な例をまとめました。 http://plnkr.co/edit/A7zbrsh8gJhdpM30ZH2PAngularJSサービスの変更された値がディレクティブ内でウォッチしない

私はサービスと2つの指令を持っています。 1つのディレクティブはサービスのプロパティを変更し、別のディレクティブはそのプロパティを監視します。私は、プロパティが変更されたときに時計が発射することを期待しましたが、それはしません。

私はサイト上でこのようないくつかの質問を見ましたが、受け入れられた解決策はここでは機能しませんでした。私は$放送を使うか、オブザーバを実装しようと考えましたが、これがうまくいくように思えます。可能ならば、複雑なことをやりたいとは思っていません。代わりに、元のコードでは

this.currentObject = newObject; 

使用

angular.copy(newObject, this.currentObject); 

答えて

5

は、viewerディレクティブは元のオブジェクト、{}を見ています。 currentObjectnewObjectに設定されている場合、$ watchはまだnewObjectではなく元のオブジェクトへの変更を探しています。

angular.copy()は元のオブジェクトを変更するので、$ watchはその変更を認識します。

+0

ありがとう、私はそれがおそらく単純なものであることを知っていました。 もう1つのスレッドは、時計の3番目のプロパティをtrueにするとそれを処理すると述べていましたので、私はそのルートを調査するのをやめました。 –

28

Mark Rajcokの回答は不完全です。 angular.copy()を指定しても、$ watch listenerは一度呼び出され、もう一度呼び出されることはありません。ここで

$scope.$watch(

    // This is the important part 
    function() { 
    return demoService.currentObject; 
    }, 

    function(newValue, oldValue) { 
    console.log('demoService.currentObject has been changed'); 
    // Do whatever you want with demoService.currenctObject 
    }, 
    true 
); 

作品plunker:

あなたが機能を見て$に必要http://plnkr.co/edit/0mav32?p=preview

ディレクティブとdemoService2両方がdemoService.currentObjectの変更について通知されていることを確認するには、ブラウザのコンソールを開きます。

この例では、btw angular.copy()は必要ありません。

+2

完璧な答え。これが正しい方法です。 – krosullivan

関連する問題