106

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

我的情况是,我有一个 $service 知道它只被一个控制器使用,并且我想在 $service 方法本身中引用控制器的范围。

这在哲学上是正确的吗?

或者我最好将事件广播到 $rootScope 然后让我的控制器监听它们?

4

4 回答 4

67

为了让控制器知道什么时候异步发生了,使用Angular 的 promises

要激发$apply,您不需要范围,您可以调用$rootScope.$apply,因为在特定范围或根中调用它没有区别。

关于变量读数,如果您收到参数会更好。但是您也可以从作用域中将其作为对象参数读取,但我会使用参数,这将使您的服务接口更加清晰。

于 2013-03-19T20:56:59.450 回答
15

我会说,如果您的功能仅特定于一个控制器,那么您就不需要服务。

控制器的任务是操作特定的模型,而服务应该处理全局任务。我宁愿坚持这种范式,也不愿把事情混为一谈。

这就是文档所说的

服务

Angular 服务是执行 Web 应用程序常见的特定任务的单例

控制器

在 Angular 中,控制器是一个 JavaScript 函数(类型/类),用于增加 Angular 范围的实例,不包括根范围。

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

于 2013-03-19T20:52:56.733 回答
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;

});
于 2014-08-22T16:34:56.080 回答
6

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

除了在关系方面令人困惑之外,像这样的事情最终会妨碍垃圾收集器。

我首选的方法是将域对象放在控制器范围内并将其传递给服务。这样,无论它是在控制器内部使用还是将来在另一个服务内部使用,服务都可以正常工作。

例如,如果服务应该从数组中推送和弹出元素errors,我的代码将是:

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

然后服务通过在 上操作与控制器交互errors。当然,我必须小心不要清除整个数组引用,但归根结底,这是 JS 普遍关心的问题。

我永远不想使用广播$apply和/或类似的东西,因为恕我直言,好的 OO 实践总是胜过任何 Angular 魔法。

于 2015-12-16T15:55:47.110 回答