我的Angularjs项目需要一个服务来为其他服务提供切换布尔值。
理想情况下,服务中可能有$ interval()循环(但我认为它不会那样)。
我使用简单的setter和getter创建了一个服务:
app.service('metro', function() {
this.setFlagValue = function(flagValue){
this.flagValue = flagValue;
}
this.getFlagValue = function(){
return this.flagValue;
}
});
全局控制器在$ interval()循环中切换布尔属性
function GlobalCtrl( $scope , $interval , metro ) {
var th = this;
$interval(function () {
th.pulse = !th.pulse;
metro.setFlagValue( th.pulse );
}, 1000 );
}
如此plunker中所示,全局控制器的布尔值正在切换,我只是无法查看该控制器是否正在更新服务中的模型。
我必须撰写错误的内容,我无法看到它。
希望有人可以提供帮助
答案 0 :(得分:0)
在你的ViewCtrl中,当你到达 p>时
th.pulse = metro.getFlagValue() ;
你将首次得到一个布尔值(假设它是真的)。从下一次开始,angular将运行摘要周期并检查th.pulse是否改变。(它不再执行函数'metro.getFlagValue ()')。
由于th.pulse引用了一个值并且没有更改,因此它不会在视图中刷新。
现在我已经更改了你的代码,使metro.getFlagValue()返回一个对象,当Digest循环再次运行时,它检查th.pulse有什么,因为它包含在服务中创建的对象refrenece,它去检查是否对象已经改变了。
现在,当对象确实发生变化时,摘要周期将会更新。 和视图将更新
我已经包含了我更改的脚本以使其运行
app.service('metro', function() {
this.flagValue = {value: false}
this.setFlagValue = function(flagValue){
this.flagValue.value = flagValue;
}
this.getFlagValue = function(){
return this.flagValue;
}
});
function GlobalCtrl( $scope , $interval , metro ) {
var th = this;
$interval(function () {
th.pulse = !th.pulse;
metro.setFlagValue( th.pulse );
}, 1000 );
}
function ViewCtrl( $scope , metro ) {
var th = this;
th.pulse = metro.getFlagValue() ;
}
<div ng-app="myApp" ng-controller="GlobalCtrl as gc" class="gc">
<p>Global Controller property: {{gc.pulse}}</p>
<div ng-controller="ViewCtrl as vc" class="vc">
<p>Reference to Global Controller property: {{gc.pulse}}</p>
<p>View Controller property [referencing service] : {{ vc.pulse.value }}</p>
</div>
</div>