将当前范围传递给AngularJS服务

S.C*_*.C. 106 data-binding angularjs angularjs-scope angular-services

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

我正处于这样一种情况,我知道它仅由一个控制器消耗,并且我希望在$ service方法本身中引用控制器的范围.

这在哲学上是否正确?

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

Cai*_*nha 67

要让控制器知道异步发生的时间,请使用Angular承诺.

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

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


F L*_*has 15

我会说,如果您的功能仅限于一个控制器而不是您不需要服务.

控制器任务是操纵特定模型,而服务应该处理全局任务.我宁愿坚持这种范式而不是混淆.

这就是文档所说的

服务

角色服务是执行Web应用程序通用的特定任务的单例

调节器

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

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

  • 谢谢.很好的回复.深入了解我的情况,重点是我正在使用服务,因为我想要一个单身人士.只有一个控制器使用该服务,但是这个控制器可以在应用程序生命周期中多次实例化,所以我真的希望服务始终处于相同的状态. (2认同)

use*_*234 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;

});
Run Code Online (Sandbox Code Playgroud)

  • @Cody我不建议这样做,因为它与依赖注入相矛盾 (2认同)

Mar*_*lli 6

我个人认为传递$scope给服务是一个坏主意,因为它创建了一个有点循环引用:控制器依赖于服务,服务取决于控制器的范围.

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

我首选的方法是将域对象放在控制器作用域中并将其传递给服务.这样,无论是在控制器内使用还是将来在其他服务中使用,服务都能正常工作.

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

var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);
Run Code Online (Sandbox Code Playgroud)

然后,服务通过操作与控制器进行交互errors.当然,我必须谨慎从不消除整个阵列参考,但在一天结束时,这是一个普遍的JS问题.

我永远不想使用广播$apply和/或类似的东西,因为非常好的OO实践总是胜过Angular-magics.