将“当前”$scope
传递给AngularJS服务是否正确?
我遇到的情况是,我知道只有一个控制器消耗了$ service,我想在$ service方法本身中引用控制器的范围。
这哲学是否正确?
或者我最好将事件广播到$ rootScope,然后让我的控制器听取它们的声音?
答案 0 :(得分:67)
要让控制器知道异步发生的时间,请使用Angular promises。
要激发$apply
,您不需要范围,可以调用$rootScope.$apply
,因为在特定范围或根目录中调用它没有区别。
关于变量读数,如果收到参数会更好。但你也可以从作为对象参数的作用域读取它,但我会使用参数,这将使您的服务接口更清晰。
答案 1 :(得分:15)
我会说,如果您的功能仅限于一个控制器而不是您不需要服务。
控制器任务是操纵特定模型,而服务应该处理全局任务。我宁愿坚持这种范式而不是混淆。
这就是文档所说的
服务
Angular服务是执行Web应用程序通用特定任务的单例
<强>控制器强>
在Angular中,控制器是一个JavaScript函数(类型/类),用于扩充角度范围的实例,不包括根范围。
PS:除此之外,如果你需要消化,你也可以在你的服务中注入$ rootScope。
答案 2 :(得分:9)
是。初始化时,可以将$ 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;
});
答案 3 :(得分:6)
我个人认为将$scope
传递给服务是一个坏主意,因为它会创建一个有点循环引用:控制器依赖于服务,服务取决于服务的范围控制器。
除了在关系方面令人困惑之外,像这样的事情最终会妨碍垃圾收集器。
我首选的方法是在控制器范围内放置domain object并将其传递给服务。这样,无论是在控制器内使用还是将来在其他服务中使用,服务都能正常运行。
例如,如果服务应该从数组errors
推送和弹出元素,我的代码将是:
var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);
服务通过errors
操作与控制器交互。
当然,我必须谨慎对待从未消除整个阵列参考,但在一天结束时,这是一个普遍的JS问题。
我永远不想使用广播,$apply
和/或类似的东西,因为非常好的OO练习总是胜过Angular-magics。