2013-12-18 9 views
35

私はコントローラからのサービスの変更を監視しようとしています。私はstackoverflow上の多くのqnsに基づいていろいろ試しましたが、私はそれを動作させることができませんでした。AngularJSトリガとコントローラからのサービスのオブジェクト値の変更

HTML:

<div ng-app="myApp"> 
    <div ng-controller="MyCtrl"> 
     <div ng-click="setFTag()">Click Me</div> 
    </div> 
</div> 

のjavascript:

var myApp = angular.module('myApp',[]); 

myApp.service('myService', function() { 
    this.tags = { 
     a: true, 
     b: true 
    }; 


    this.setFalseTag = function() { 
     alert("Within myService->setFalseTag"); 
     this.tags.a = false; 
     this.tags.b = false; 

     //how do I get the watch in MyCtrl to be triggered? 
    }; 
}); 


myApp.controller('MyCtrl', function($scope, myService) { 

    $scope.setFTag = function() { 
     alert("Within MyCtrl->setFTag"); 
     myService.setFalseTag(); 
    };   

    $scope.$watch(myService.tags, function(newVal, oldVal) { 
     alert("Inside watch"); 
     console.log(newVal); 
     console.log(oldVal); 
    }, true); 

}); 

がどのように私はコントローラにトリガする時計を入手できますか?

jsfiddle

+0

はhttp://stackoverflow.com/([こちら]問題の私の答えを参照してください。質問/ 20623715 /アングル・ウォッチ・ド・ノー・オール・ファイアー・イベント・イン・マイ・ディレクティブ/ 20623766#20623766)。あなたの 'watch'関数の構文はあなたが望むものではありませんが、まだ有効な角度構文です。な​​ぜなら、あなたはログエラーを取得していないからです。 – Hylianpuffball

答えて

75

この方法によって$watchを書いてみる:

myApp.controller('MyCtrl', function($scope, myService) { 


    $scope.setFTag = function() { 
     myService.setFalseTag(); 
    };   

    $scope.$watch(function() { 
     return myService.tags; 
    },      
     function(newVal, oldVal) { 
     /*...*/ 
    }, true); 

}); 

デモFiddle

[EDIT]

サービスが3Dパーティから更新された場合は、特にこの方法は機能しません。

有効にするには、のダイジェストサイクルを有効にする必要があります。ここで

は一例です:

サービス面では、我々はtags値書き込みを更新するときのようなもの:

if($rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest'){ 
    $rootScope.$apply(function() { 
    self.tags = true; 
    }); 
} 
else { 
    self.tags = true; 
    } 
+11

私はあなたがこのように時計を使うことができるとは考えていませんでした。これはゲームのチェンジャーです。そんなに勝つ。 – joseym

+0

私にとってこの方法は、変数のスペルミスを避けるために優れています。 –

+0

あなたの編集...なぜ?!? – Phill

関連する問題