当一个范围变量依赖于AngularJS中的服务时,它是什么时候更新的?

时间:2017-09-07 13:20:53

标签: javascript angularjs service angularjs-scope

让我们说我有以下控制器,并提供以下服务:

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 调用服务内容。但是,在尝试了很多事情之后,我不知道该怎么做。

非常感谢任何帮助,谢谢你们!

2 个答案:

答案 0 :(得分:2)

  

如果我按下按钮,从而更改服务中变量的内容,它是否也会更改两个范围中变量的值,因为它调用了服务?

没有

服务没有范围,因此摘要周期不会影响您的价值。

其他控制器有自己的范围,您需要广播要调用的事件

$scope.MyVariable = MyService.getMyVariable();

或触发摘要周期

作为旁注:

使用具有相同名称的控制器并不是一种好习惯。使用组件或指令来避免意外行为

答案 1 :(得分:1)

当您致电updateMyVariable时,它仅在第二个实例中更新$scope.MyVariable。你是对的,你应该从模板中调用服务的内容。

小提琴:http://jsfiddle.net/5rsr2grg/1/

直接从模板调用函数会大大降低应用程序的性能。仅当被调用函数不执行复杂操作时才值得这样做。例如,当它只获得一些变量/属性/等。但在你的情况下,一切都还可以。