将当前范围传递给AngularJS服务

将“当前” $scope传递给AngularJS服务是正确的吗?

我在我有一个$服务的情况下,知道它只被一个控制器消耗,我想在$ service方法本身中引用控制器的作用域。

这在哲学上是正确的吗?

或者我最好把事件广播到$ rootScope,然后让我的控制器听取他们的意见?

为了让控制器知道什么时候asynchronous发生,使用Angular promise 。

为了激发$apply ,你不需要这个范围,你可以调用$rootScope.$apply ,因为在特定范围或者根目录下调用它没有区别。

关于variables读数,如果您收到参数,会更好。 但是你也可以把它作为一个对象参数从一个范围读取,但是我会去参数,这将使你的服务接口更清晰。

我会说,如果你的function只针对一个控制器而不是你需要的服务。

控制器的任务是操纵特定的模型,而服务应该处理全局任务。 我宁愿坚持这个范例,而不是把事情搞混。

这是文档所说的

服务

angular度服务是单身人士,执行web应用程序通用的特定任务

调节器

在Angular中,控制器是一个JavaScript函数(types/类),用于扩充angular度范围的实例,不包括根范围。

PS:除此之外,如果您需要消化,也可以在您的服务中注入$ rootScope。

是。 初始化时,您可以将$ scope传递给服务。 在服务构造函数中,您可以将范围指定为类似this._scope的内容,然后在服务中引用该范围!

 angular.module('blah').controller('BlahCtrl', function($scope, BlahService) { $scope.someVar = 4; $scope.blahService = new blahService($scope); }); angular.module('blah').factory('blahService', function() { //constructor function blahService(scope) { this._scope = scope; this._someFunction() } //wherever you'd reference the scope blahService.prototype._someFunction = function() { this._scope['someVar'] = 5; } return blahService; }); 

我个人认为把$scope传给一个服务是一个坏主意 ,因为它创build了一个循环引用:控制器依赖于服务,服务依赖于控制器的范围。

除了在关系上混淆之外,像这样的东西最终阻碍了垃圾收集器。

我的首选方法是将一个域对象放在控制器范围内,并将其传递给服务。 这种方式服务工作,不pipe是否在控制器内部使用,或者在将来可能在另一个服务内部使用。

例如,如果服务应该推送和popuparrayserrors元素,我的代码将是:

 var errors = []; $scope.errors = errors; $scope.myService = new MyService(errors); 

该服务通过操作errors与控制器交互。 当然,我必须保持谨慎,不要抹去整个数组的引用,但在一天结束的时候,这是一个普遍的JS关注。

我绝对不想使用广播, $apply和/或类似的东西,因为不pipe怎么样,好的面向对象的做法总是会胜过任何angular度的魔法。