【问题标题】:AngularJs: Calling Service/Provider from app.configAngularJs:从 app.config 调用服务/提供者
【发布时间】:2015-07-23 12:04:57
【问题描述】:

我想从 app.config 中调用我的服务。

在搜索此内容时,我发现 this question 带有我尝试遵循的解决方案(不是已接受的答案,但下面的解决方案标题为“将您的服务设置为自定义 AngularJS 提供程序")

但是,使用该解决方案以及建议的替代方案时,当我尝试从 app.config 中调用服务时遇到问题(似乎根本没有调用该服务)。我是 angular 和 javascript 的新手,并不知道如何正确调试(我正在使用 firebug)。我希望你能帮助我一些指示和可能的解决方案。

当前代码(尝试从链接的问题中实现“可能的替代方案”:

angular.module('myApp', [
  'ngRoute',
])
.config(['$routeProvider', '$locationProvider', '$provide', function($routeProvider, $locationProvider, $provide) {

$provide.service('RoutingService',function($routeParams){
    var name = $routeParams.name;
    if (name == '') {name = 'testfile'}

    var routeDef = {};
    routeDef.templateUrl = 'pages/' + name + '/' + name + '.html';
    routeDef.controller = name + 'Ctrl';
    return routeDef;
})

//Here i would like to get a hold of the returned routeDef object defined above.
$routeProvider.when('/name:', {
                        templateUrl: RoutingService.templateUrl, 
                        controller: RoutingService.controller
                    });

我之前的尝试是通过提供者这样声明服务:

var ServiceModule = angular.module('RoutingServiceModule', []);

ServiceModule.provider('routingService', function routingServiceProvider(){
      this.$get = [function RoutingServiceFactory(){

         return new RoutingService(); 
      }]
});

function RoutingService(){
    this.getUrlAndControllerFromRouteParams = function($routeParams){
        var name = $routeParams.name;

        var routeDef = {};
        routeDef.templateUrl = 'pages/' + name + '/' + name + '.html';
        routeDef.controller = name + 'Ctrl';
        return routeDef;
    }
}

并尝试像我通常在控制器中调用服务一样调用它(当然,在将RoutingServiceModel 添加到myApp 的依赖项之后)。在这两种情况下,当我导航到我的视图时,templateUrl 和控制器都没有设置,所以我想我缺少一些依赖项,或者没有正确调用服务。

有什么想法吗?

【问题讨论】:

  • 这里的答案:stackoverflow.com/questions/16828287/… 非常详细地回答了我的问题。理论上,我可以在应用程序的config 阶段使用提供程序,但在run 阶段之前,我无法访问任何服务实例(就像我尝试使用$routeParams)。

标签: javascript html angularjs routes


【解决方案1】:

在配置阶段,只能注入提供程序(使用 AUTO 模块中的服务除外--$provide 和 $injector)。

请查看此工作演示:http://jsfiddle.net/nxbL66p2/

angular.module('Joy',[])
.config(function($provide) {
  $provide.provider('greeting', function() {
    this.$get = function() {
      return function(name) {
        alert("Hello, " + name);
      };
    };
  });
})
.controller('MyCtrl', ['$scope', 'greeting', function ($scope, greeting) {
    $scope.greet = function () {
        greeting('Joy');
    };
}]);

简单的 HTML:

<div ng-app="Joy">
    <div ng-controller="MyCtrl">
        <div ng-click="greet()">Click to greet.</div>
    </div>
</div>

参考:https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection

【讨论】:

    【解决方案2】:

    Angular 的术语有点混乱,因为“服务”和“提供者”可能会根据上下文指定不同的东西。根据in the manual的说法,

    Angular 服务是由服务工厂创建的单例对象。 这些服务工厂是函数,而这些函数又是由 服务提供者。服务提供者是构造函数。 实例化时,它们必须包含一个名为 $get 的属性,它 持有服务工厂函数。

    你不能在config中注入服务(constant除外),只能是服务提供者,你的RoutingService在那里不适用。

    从技术上讲,您可以在那里获得服务

    RoutingServiceProvider.$get();
    

    但它会创建一个单独的实例(而不是单例对象),并且在 config 中调用它时,$routeParams 的使用毫无意义。

    您可以将templateUrl 用作函数(请参阅the manual),而动态控制器名称不适合路由配置,请使用ng-controller 在模板中定义它们。

    【讨论】:

    • 从技术上讲,我正在尝试从config 中调用提供者,这应该是可能的,对吧?根据我的理解,让提供商提供服务也应该是可能的。我不太明白为什么这个组合在这里不适用 - 你能进一步解释一下吗?
    • 取自docs.angularjs.org/guide/servicesYou can also register services via the $provide service inside of a module's config function:。这就是我试图用我的 RoutingService 做的事情。在这种情况下,我是否误解了“注册”?我以为我可以在注册后立即使用该服务,
    • 是的,你误会了,angular.provider('RoutingService', ...$provide.provider('RoutingService', ... 几乎是同一个东西(后者不太通用,因为将 RoutingServiceProvider 注入到其他 config 块中会出现问题)。在完成所有config 块之后,Angular 从服务提供者生成单例,config 的目的是在服务实例化之前配置提供者。 $routeProvider 也不例外,它期望在 $route 服务被实例化之前进行一些 static 配置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2016-10-25
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多