在Angularjs中将服务/常量注入提供者

时间:2014-03-14 21:25:04

标签: javascript angularjs dependency-injection provider

这里的问题是我能够访问getRoutes(),但我无法访问注入的常量 - “配置”。我错过了什么?感谢。

(function () {
    'use strict';

    var app = angular.module('app');

    app.constant('configuration', {
       PARTIAL_PATH: "/app/components/partials"
    });

    app.module('app', [
        'routeService'
    ]);

    var routeServiceModule = angular.module('routeService', ['common']);

    routeServiceModule.provider('routeConfig',function () {

    this.getRoutes = function () {
        return [
            {
                url: '/login',
                config: {
                    title: 'admin',
                    templateUrl: 'app/components/login/login.html'
                }
            }, {
                url: '/',
                config: {
                    templateUrl: 'app/components/dashboard/dashboard.html',
                    title: 'Dashboard'
                }
            }
        ];
    };

    this.$get = ['configuration', function (configuration) {

        var service = {
            getRoutes: getRoutes(),
            configuration: configuration.PARTIAL_PATH
        };

        return service;
    }];

app.config(['$routeProvider', 'routeConfigProvider', function ($routeProvider, routeConfigProvider) {
        //Unable to get the configuration value
        console.log(routeConfigProvider.configuration);
       //Console is returning as "undefined"
        routeConfigProvider.getRoutes().forEach(function(r) {
            $routeProvider.when(r.url, r.config);
        });
        $routeProvider.otherwise({ redirectTo: '/' });
    }
]);
})();

创建了一个plunkr演示:http://plnkr.co/edit/2TIqgxMxBJEPbnk2Wk6D?p=preview

3 个答案:

答案 0 :(得分:1)

我认为你可能会使路线过于复杂化。你可能有一个很好的理由但是我不知道它可能会建议你用这样的东西保持简单:

MyApp.config(function ($routeProvider) {
    $routeProvider.when('/home', {
        templateUrl: 'home.html',
        controller: 'HomeController',
        activeTab: 'home'
    })
};

MyApp.controller('HomeController', function ($route) {
    console.log($route.current.activeTab);
});

我很想知道为什么你可能无法使用这种路由模式或故意选择不同的东西。

答案 1 :(得分:1)

(关于你的最后评论,与plnkr一起)

预期结果。

在配置时(在app.config()中),您可以访问原始提供程序(如您所定义的那样),这允许您调用“私有”方法或字段(testItem1)并将其配置为运行时使用。 “私有”,因为它们在运行时无法访问。

在运行时(在app.run()和应用程序的其余部分中),当您要求为您编写提供程序的依赖项时,角度注入器会向您提供提供程序的$ get方法的结果,不是提供者本身,因此您无法访问“私人”功能。

此页面是我的启蒙之路:AngularJS: Service vs provider vs factory

答案 2 :(得分:0)

我认为这与您创建初始模块的方式有关。试试这个:

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

    app.constant('configuration', {
       PARTIAL_PATH: "/app/components/partials"
    });

    var routeServiceModule = angular.module('routeService', ['app']);