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封装的数据进行操作