将当前范围传递给AngularJS服务

时间:2013-03-19 20:11:41

标签: angularjs data-binding angularjs-scope angular-services

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

我遇到的情况是,我知道只有一个控制器消耗了$ service,我想在$ service方法本身中引用控制器的范围。

哲学是否正确?

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

4 个答案:

答案 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。