让我们说我有以下控制器,并提供以下服务:
angular.module('ionicApp').controller("MyCtrl", function($scope, MyService){
$scope.MyVariable = MyService.getMyVariable();
$scope.updateMyVariable = function(valueFromHTML){
MyService.setMyVariable(valueFromHTML);
$scope.MyVariable = MyService.getMyVariable();
};
})
.service("MyService", function(){
this.MyVariable = {};
this.getMyVariable = function(){
return this.MyVariable;
}
this.setMyVariable = function(value){
this.MyVariable = value;
return true;
}
});
现在让我们采用以下HTML:
<div class="instance-1" ng-controller="MyCtrl">
<div class="info-from-controller">
<p>{{MyVariable}}</p>
</div>
</div>
<div class="instance-2" ng-controller="MyCtrl">
<button ng-click="updateMyVariable('newValue')">Click me</button>
</div>
让我们说不可能将2个html部分放在同一个div中,它必须是控制器的不同实例。
如果我按下按钮,从而更改服务中变量的内容,它是否也会更改两个范围中变量的值,因为它调用服务?
我自然会说&#34;只是在与更新变量&#34;的按钮相同的范围内。我的印象由this jsFiddle确认。
但是,我该如何继续更新第二个范围呢?有没有办法触发&#34;控制器,以便它再次检查服务的内容?
在我的情况下,理想的解决方案是能够从HTML 调用服务内容。但是,在尝试了很多事情之后,我不知道该怎么做。
非常感谢任何帮助,谢谢你们!
答案 0 :(得分:2)
如果我按下按钮,从而更改服务中变量的内容,它是否也会更改两个范围中变量的值,因为它调用了服务?
没有
服务没有范围,因此摘要周期不会影响您的价值。
其他控制器有自己的范围,您需要广播要调用的事件
$scope.MyVariable = MyService.getMyVariable();
或触发摘要周期
作为旁注:
使用具有相同名称的控制器并不是一种好习惯。使用组件或指令来避免意外行为
答案 1 :(得分:1)
当您致电updateMyVariable
时,它仅在第二个实例中更新$scope.MyVariable
。你是对的,你应该从模板中调用服务的内容。
小提琴:http://jsfiddle.net/5rsr2grg/1/
直接从模板调用函数会大大降低应用程序的性能。仅当被调用函数不执行复杂操作时才值得这样做。例如,当它只获得一些变量/属性/等。但在你的情况下,一切都还可以。