javascript - 告诉 AngularJs 通过依赖注入(inject)返回一个新实例

标签 javascript angularjs

用例很简单:我有两个 Controller 共享相同的依赖项MyService。该服务正在保存某种状态,让我们坐一下myVariable。如果我从 ControllerOne 设置它,那么它也会被 ControllerTwo 发现。

我想要的是每个 Controller 都有自己的 MyService 实例,以便每个 Controller 都可以更改 myVariable 而不会影响另一个 Controller 。

换句话说 - 我希望通过依赖注入(inject)返回新实例而不是单例

最佳答案

并不像您希望的那样直接。服务实例是在注入(inject)器第一次检索并由注入(inject)器维护时创建的……换句话说,它们始终是单例。 The magic happens in here ,特别是查看 provider 函数,它将提供程序实例放入providerCache 对象中。

但不要失去希望,如果您选择的话,您可以轻松地为您想要在服务中共享的任何内容添加构造函数:

app.factory('myService', [function() {
     var i = 1;

     function Foo() {
        this.bar = "I'm Foo " + i++;
     };

     return {
          Foo: Foo
     };
}]);

app.controller('Ctrl1', function($scope, myService) {
  $scope.foo = new myService.Foo();
  console.log($scope.foo.bar) //I'm Foo 1
});

app.controller('Ctrl2', function($scope, myService) {
  $scope.foo = new myService.Foo();
  console.log($scope.foo.bar) //I'm Foo 2
});

编辑:正如OP指出的,还有$injector.instantiate ,您可以使用它来调用 Controller 外部的 JavaScript 构造函数。我不确定这里的可测试性意味着什么,但它确实为您提供了另一种注入(inject)代码的方法,该代码将为您构造一个新对象。

关于javascript - 告诉 AngularJs 通过依赖注入(inject)返回一个新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13604655/

相关文章:

php - 在哪里为 Angular-Codeigniter 项目中的图形创建数组

javascript - 无法将带 Angular 列中的数字相加

javascript - 我必须将 $scope 原语包装在对象中,但可以使用函数而不包装它们。为什么?

javascript - 为什么 Ember-Simple-Auth 支持刷新 token ? (JS + OAuth 2.0)

javascript - 当使用它的函数被称为 'this' Hello")` 时, `new myFunction("指什么

javascript - img 标签 IE 上的 src 与 href

AngularJS 绑定(bind) + chrome 重绘错误 : text is not refreshed

javascript - Phonegap/AngularJS : Get lat/long from inside function

javascript - 表单提交后未设置值

Javascript 表单验证多重使用占位符