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变量。
答案 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是其他历史记录