angularjs引用来自控制器

时间:2018-04-12 11:34:05

标签: angularjs service

我的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中所示,全局控制器的布尔值正在切换,我只是无法查看该控制器是否正在更新服务中的模型。

我必须撰写错误的内容,我无法看到它。

希望有人可以提供帮助

1 个答案:

答案 0 :(得分:0)

在你的ViewCtrl中,当你到达

  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>