AngularJS,在控制器之间共享数据

AngularJS,在控制器之间共享数据,angularjs,service,controller,Angularjs,Service,Controller,所以,这不是如何做的典型问题。我知道这可以通过服务或工厂来实现,但我想知道是否有人可以分享一下创建基本服务、将其注入每个控制器、然后使用每个控制器的功能扩展服务的优点/缺点。类似于以下示例的内容 app.service('HelperService', function() { return {}; }); app.controller('Controller1', function($scope, HelperService) { $scope.somefunc = func

所以,这不是如何做的典型问题。我知道这可以通过服务或工厂来实现,但我想知道是否有人可以分享一下创建基本服务、将其注入每个控制器、然后使用每个控制器的功能扩展服务的优点/缺点。类似于以下示例的内容

app.service('HelperService', function() {
    return {};
});

app.controller('Controller1', function($scope, HelperService) {
    $scope.somefunc = function() {
        //do stuff here
    };
    HelperService.somefunc = $scope.somefunc;
});

app.controller('Controller2', function($scope, HelperService) {
    HelperService.somefunc();
});

这很有效,而且效果很好。问这个问题我觉得有点傻,但我似乎在这里遗漏了一些东西,比如为什么不使用或不推荐它?

该服务是一个单例服务,一旦调用函数本身的
new
,它就会被实例化——您传入的函数本质上是一个构造函数。这将创建要返回的空对象,以便在任何地方使用,但如果您希望以这种方式返回对象,则使用
.factory
会更有意义,但这不是什么大问题

无论如何,你可以考虑你的代码在概念上做到这一点:

var HelperService = function () {}
var helperService = new HelperService;

function Controller1() {
    helperService.someFunc = function () {}
}
function Controller2() {
    helperService.someFunc();
}
我认为这是一个危险的事情,原因有两个:

  • Controller1
    必须在
    Controller2
    之前实例化,否则
    somefunc
    将无法用于
    Controller2
    。理想情况下,控制器彼此不了解
  • 您正在将控制器/视图模型(因为您使用的是范围)与服务级别逻辑耦合,但这些应该是解耦的
    HelperService
    也不应该知道控制器。相反,您应该注入一个具有控制器期望使用的API的服务。这不一定总是
    HelperService
    ,它只需要在控制器上看起来像
    HelperService
    ,并且它的API不应该改变

  • 如果不知道你想做什么的细节,很难给出建议。通常,您可能会重新考虑要做什么,但您可以使用其他服务扩展服务的功能。考虑服务是属于他们自己的。

    它可能起作用,但这是个坏主意。

    • Controller2
      HelperService.somefunc()
      在实例化
      Controller1
      之前不存在。因此,
      Controller2
      Controller1
    • HelperService
      上的代码不在一个可以一起理解的地方
    • 如果您在该函数中执行某种类型的数据操作,那么它实际上应该对HelperService封装的数据进行操作

    服务是单例的,因此您可以扩展它们。如果你让控制器添加功能,那会变得很混乱,为什么不首先用它们来构建你的服务呢?是的,不可否认,它会变得混乱,在服务中做一些事情会更干净。我只是好奇这样做是否有利也有弊(除了混乱)。考虑一下,尝试维护一个更大的应用程序,控制器向服务添加功能,其他控制器调用这些功能。