将服务变量绑定到控制器AngularJS

时间:2016-09-22 20:35:01

标签: javascript angularjs service controller

http://jsfiddle.net/9hazjjcc/

var myApp = angular.module('myApp',[]);

function MyCtrl($scope, myService) {
    $scope.targetMode = myService.targetMode; 
    $scope.myService = myService;
}

myApp.service('myService', function() {
    this.targetMode = 2;
});

function ctrlTwo($scope, myService) {
    $scope.addToTargetMode = function() {
    myService.targetMode++;
 }
}

HTML:

<div ng-controller="MyCtrl">
  <p>Hello, {{ targetMode }}!</p>
  <p>Hello, {{ myService.targetMode }}!</p>
</div>

<div ng-controller="ctrlTwo">
  <button ng-click="addToTargetMode()">
    Add To Target Mode
  </button>
</div>

这个JSFiddle说的大部分内容。我想在控制器中使用服务变量来操作视图,但我不想将整个服务暴露给控制器,因为它看起来不像Angular一样。或者这被认为是最佳做法?

理想情况下,第一段会更新,以便在服务发生变化时从服务中显示targetMode变量。

1 个答案:

答案 0 :(得分:0)

你的方式还不错,如果你的服务是为了管理“目标模式”而创建的,你可以使用那种方式,但我认为不是暴露this.targetMode = 2,这是服务功能,你可以使用服务就像模型模式一样,在你的服务中你可以这样做:

myApp.service('myService', function() {
    var targetMode = 2;

    return {
        getTargetMode: function() { return targetMode; }
});

您可以将您的服务私有功能混合使用,只展示公共等等。

但是,在我看来,由于targetMode的上下文,我认为最好是一个控制器变量(范围变量,我的意思),如你所知,服务不是注入范围,它们不是一个范围循环的一部分,你在模板中使用这个变量所以我认为你想要角度“绑定”,所以最好使用范围变量并在控制器中声明(可能在自定义指令中取决于每种情况)。这是角度方式。 如果您使用服务(非范围var),您可以在控制器中手动查看它,或者您正在使用函数作为观察者,但使用范围变量更有效。

问题是,您用于绑定的$ scope变量:$ scope.addToTargetMode,被声明为函数,对,它是正确的,因为您需要转到服务,在摘要周期中效率较低直接使用控制器中的值。让我解释一下,在所有的摘要周期中,angular将执行你的函数。因此,如果您直接使用范围变量(忘记服务),摘要周期将不会是一个附加调用,因为范围具有“他自己的强大管理”。 Angular手表本身就是范围变量:对象,字符串,数字,数组,并且如果它发生变化就会做“改变”并且你不做任何事情!但是对于范围函数变量,角度魔法效果最差,因为在所有摘要中循环此函数将被计算。

所以,总是你会使用变量进行绑定,想一想控制器,例如服务就好了,你需要从bbdd或其他什么来获取数据。当然,这仅适用于使用Angular 1.X.X,Angular 2是其他历史记录