一尘不染

Angular JS-使服务可以从控制器和视图全局访问

angularjs

假设我们提供以下服务:

myApp.factory('FooService', function () { ...

然后,从控制器,我会说:

myApp.controller('FooCtrl', ['$scope', 'FooService', function ($scope, FooService) { ...

问题分为两部分:

  1. 全局可访问性 :如果我有100个控制器,并且所有人都需要访问该服务,则我不想显式注入它100次。 如何使服务在全球范围内可用? 目前,我唯一能想到的就是从根范围内包装它,这违背了目的。
  2. 视图的 可访问性:如何 从视图 内访问服务? 这篇文章建议从控制器内部包装服务。如果要花这么长的时间,似乎我应该只在根范围上实现功能?

阅读 195

收藏
2020-07-04

共1个答案

一尘不染

找到了合理的解决方案。将其注入bootstrap方法(运行),并将其添加到根范围。从那里它将对所有控制器和视图可用。

myApp.run(function ($rootScope, $location, $http, $timeout, FooService) {
    $rootScope.foo = FooService;
    ....

重新阅读我上面提到的帖子,它没有完全说“包装”……只是“抽象”,所以我认为张贴者指的是相同的解决方案。

为了全面,对(1)的答案为:

myApp.controller('FooCtrl', ['$scope', function ($scope) { 
    // scope inherits from root scope
    $scope.foo.doSomething();
    ...

(2)的答案很简单:

{{doSomething()}}

添加克里斯托弗的评论以确保它被看到:

@rob-
根据最佳实践,应该将工厂注入需要使用它的控制器中,而不是在根范围上。如所问到的,第一个问题实际上是反模式。如果需要工厂100次,则注入100次。最小化时几乎没有任何多余的代码,并且可以很清楚地知道工厂的使用位置,并且通过在功能签名中列出所有必需的工厂,可以更轻松(更明显)地使用模拟方法测试那些控制器。–
Christopher WJ Rueber 13年11月25日在20:06

2020-07-04