2013-12-18 74 views
35

我試圖從控制器監視服務中的更改。我基於許多qns在stackoverflow上嘗試了各種各樣的東西,但我一直無法使它工作。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

[編輯]

有時候,這種方式不會工作,特別是如果服務已從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

相關問題