2016-09-22 58 views
1

http://jsfiddle.net/9hazjjcc/装订服务变量要控制AngularJS

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-like。还是被认为是最佳做法?

在理想情况下,第一个段落将更新从每当它改变了服务显示targetMode变量。

回答

0

你的方式,它不坏,如果你的服务是为了管理“目标模式”,就可以使用这种方式,但我认为不是暴露this.targetMode = 2,这是服务功能,您可以使用像模特模式的服务,在你的服务,你可以做些事情是这样的:

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

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

您可以在您服务的私人功能混合,只有公开曝光,等等等等

但是,在我看来,由于到targetMode的背景下,我认为这是最好是控制器变量(scope变量我的意思),你也知道,服务不被注入一个范围,他们并不像一个PA范围周期的室温,而你在模板中使用这个变量,所以我想你想的角“绑定”,所以最好使用范围变量,并宣布在控制器(也许在一个自定义的指令取决于每个案件)。这是角度方式。 如果使用服务(非范围VAR),则可以在控制器手动观看或作为你正在做的,则可以使用一个功能作为一个观察者,但使用范围变量是更有效的。

事情是,你用于绑定的$ scope变量:$ scope.addToTargetMode,被声明为一个函数,对,它是正确的,因为你需要去服务,在digest循环中这是少的有效地直接使用控制器中的值。让我解释一下,在所有的摘要循环中,角将执行你的函数。所以,如果你直接使用范围变量(忘记服务),摘要周期不会是一个辅助调用,因为范围有“他自己的优秀管理”。 角手表本身的范围变量:对象,字符串,数字,数组,如果它的变化,你有没有做任何事情!但作用域函数变量的角度神品最差的,因为在所有会做“转变”摘要循环这个函数将被计算。

所以,总是在你将使用一个变量绑定,认为控制器,例如服务,如果你需要从BBDD或任何得到的数据将是不错的。可以肯定,如果你使用的角度1.X.X这只适用,角2是其他历史