如何创建一个不与使用它的控制器共享其值的服务对象

时间:2015-06-19 23:46:37

标签: angularjs angularjs-service angularjs-factory angularjs-provider

假设我创建了一个像这样的工厂,服务或提供者对象

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 ......

如何编写工厂,服务或提供程序,以便每个控制器获取服务对象的不同副本?

2 个答案:

答案 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>

Plunkr

答案 1 :(得分:0)

只需将.factory更改为.service,每次注入时都会提供一个唯一的范围。

在此答案中更好地描述了这一点的原因:AngularJS: Service vs provider vs factory