假设我创建了一个像这样的工厂,服务或提供者对象
myApp.factory('myService', function() {
return {
counter: 0,
increment: function() {
console.log('counter: ' + (this.counter++))
}
};
});
假设我有一个依赖它的控制器
myApp.controller('myCtrl', function(myService) {
$scope.incr = function() {
myService.increment();
};
}
我将这个控制器应用于html的不同部分
<div ng-controller="myCtrl">
<button ng-click="increment()">increment</button>
</div>
...
<div ng-controller="myCtrl">
<button ng-click="increment()">increment</button>
</div>
现在,当我点击每个按钮时,计数器是通用的,它会变为0,1,2,3 ......
如何编写工厂,服务或提供程序,以便每个控制器获取服务对象的不同副本?
答案 0 :(得分:5)
由于工厂是单身,您需要在工厂中使用一种方法来创建服务。更改您的服务以使用create方法返回执行递增的服务:
myApp.factory('myService', function() {
return {
create: function () {
return {
counter: 0,
increment: function() {
console.log('counter: ' + (this.counter++));
}
};
}
};
});
myApp.controller('myCtrl', function($scope, myService) {
var service = myService.create();
$scope.incr = function() {
service.increment();
};
});
此外,控制器方法名称与视图中的内容不匹配:
<div ng-controller="myCtrl">
<button ng-click="incr()">increment</button>
</div>
...
<div ng-controller="myCtrl">
<button ng-click="incr()">increment</button>
</div>
答案 1 :(得分:0)
只需将.factory更改为.service,每次注入时都会提供一个唯一的范围。
在此答案中更好地描述了这一点的原因:AngularJS: Service vs provider vs factory