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变量。

最佳答案

您的方式还不错,如果您创建服务来管理“目标模式”,则可以使用该方式,但我认为与其公开this.targetMode = 2,这是服务功能,还可以像模型一样使用服务模式,在您的服务中您可以执行以下操作:

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

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


您可以混合使用服务的私有功能,而仅公开公共等。

但是,我认为,由于targetMode的上下文,我认为最好将其作为控制器变量(我的意思是范围变量),如您所知,服务不应注入作用域,它们也不应作为作用域的一部分循环,并且您正在模板中使用此变量,因此我认为您需要角度“绑定”,因此最好使用范围变量并在控制器中声明(也许在自定义指令中取决于每种情况)。这是成角度的方式。
如果使用服务(非作用域var),则可以在控制器中手动观察它,也可以在执行操作时将其用作观察者,但使用范围变量则更为有效。

事实是,用于绑定的$ scope变量:$ scope.addToTargetMode被声明为一个函数,对,这是正确的,因为您需要转到服务,在摘要循环中,这比直接使用效率低控制器中的值。让我解释一下,在所有摘要循环中,角度将执行您的功能。因此,如果直接使用范围变量(忘记服务),则摘要周期将不是一个附加的调用,因为范围具有“自己的出色管理能力”。
Angular本身会监视范围变量:对象,字符串,数字,数组,并且如果发生更改并且您无需执行任何操作,它们将进行“更改”!但是对于范围函数变量,Angular Magic的效果最差,因为在所有摘要中周期将计算此函数。

因此,总是需要使用变量进行绑定,在控制器中考虑,例如,如果需要从bbdd或其他任何设备获取数据,则服务会很好。当然,这仅在使用Angular 1.X.X时适用,而Angular 2是其他历史记录

关于javascript - 将服务变量绑定(bind)到 Controller AngularJS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39648406/

10-12 00:03
查看更多