将“当前”传递$scope
给 AngularJS 服务是否正确?
我的情况是,我有一个 $service 知道它只被一个控制器使用,并且我想在 $service 方法本身中引用控制器的范围。
这在哲学上是正确的吗?
或者我最好将事件广播到 $rootScope 然后让我的控制器监听它们?
将“当前”传递$scope
给 AngularJS 服务是否正确?
我的情况是,我有一个 $service 知道它只被一个控制器使用,并且我想在 $service 方法本身中引用控制器的范围。
这在哲学上是正确的吗?
或者我最好将事件广播到 $rootScope 然后让我的控制器监听它们?
为了让控制器知道什么时候异步发生了,使用Angular 的 promises。
要激发$apply
,您不需要范围,您可以调用$rootScope.$apply
,因为在特定范围或根中调用它没有区别。
关于变量读数,如果您收到参数会更好。但是您也可以从作用域中将其作为对象参数读取,但我会使用参数,这将使您的服务接口更加清晰。
我会说,如果您的功能仅特定于一个控制器,那么您就不需要服务。
控制器的任务是操作特定的模型,而服务应该处理全局任务。我宁愿坚持这种范式,也不愿把事情混为一谈。
这就是文档所说的
服务
Angular 服务是执行 Web 应用程序常见的特定任务的单例
控制器
在 Angular 中,控制器是一个 JavaScript 函数(类型/类),用于增加 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
给服务是一个坏主意,因为它创建了一种循环引用:控制器依赖于服务,而服务依赖于控制器的范围。
除了在关系方面令人困惑之外,像这样的事情最终会妨碍垃圾收集器。
我首选的方法是将域对象放在控制器范围内并将其传递给服务。这样,无论它是在控制器内部使用还是将来在另一个服务内部使用,服务都可以正常工作。
例如,如果服务应该从数组中推送和弹出元素errors
,我的代码将是:
var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);
然后服务通过在 上操作与控制器交互errors
。当然,我必须小心不要清除整个数组引用,但归根结底,这是 JS 普遍关心的问题。
我永远不想使用广播$apply
和/或类似的东西,因为恕我直言,好的 OO 实践总是胜过任何 Angular 魔法。