使用AngularJS Provider与GET和SET

时间:2015-05-13 10:12:01

标签: angularjs

my last question中,我确实搜索了一个解决方案,以便在.config期间使用AngularJS中的值。我知道我必须使用提供者。现在我尝试使用此提供程序设置值。似乎提供商存在限制,我可以在.config期间设置一些内容吗?我收到错误“TypeError:appState.setState不是函数”,但setState是一个函数,至少对我的理解。我错了?

代码:

angular
    .module('main', [
        'ngRoute'
    ])

    .provider('appState', function(){
        var appState;

        this.setState = function(newState) {
            appState = newState;
        };

        this.getState = function() {
            return appState;
        };

        this.$get = function() {
            return appState;
        };

        function init() {appState='/home';}
        init();

    })
    .config(function($routeProvider, appStateProvider){

        $routeProvider
            .when('/home', {
                templateUrl: "partials/home"
            })
            .when('/info', {
                templateUrl: "partials/info"
            })
            .otherwise({
                redirectTo: appStateProvider.getState()
            })

    })

    .run(function ($rootScope, appState) {

        $rootScope.$on('$routeChangeStart', function (event, next, current) {
            if (next.$$route) {
                appState.setState(next.originalPath); 
                // -> ERROR: "TypeError: appState.setState is not a function"
            }
        })

    })

;

1 个答案:

答案 0 :(得分:1)

提供商就像一个由两部分组成的服务,其最小形式就像一个工厂:

aModule.provider('foo', function() {
  this.$get = function() {
    return 1;
  }
});

然后你可以在任何其他服务,指令,控制器和run函数中注入它:

aModule.controller('BarCtrl', function(foo) { ... });

注意我是如何使用foo作为提供者的名称。

这样做是向控制器注入$get 返回的内容。 AKA,如果您在控制器中记录foo,您将获得 1

那么提供者的意义何在?能够在应用程序运行之前配置服务。

aModule.provider('foo', function() {
  var appState;

  this.setState = function(newState) {
    appState = newState;
  }  

  this.$get = function() {
    return appState;
  }
});

在这种情况下,除$get函数外,我们还有其他一些功能。我们怎样才能使用它们?我们需要注入提供者本身并且工厂。我们怎么能这样做?

aModule.config(function(fooProvider) {
  fooProvider.setState('Hello');
}

请注意我这次使用的时间是fooProvider,而不仅仅是foo。这就是说我注射了提供者本身。也就是说,提供者只能注入.config函数和其他提供者的构造函数。

现在,如果您在我们的控制器中记录foo,我们会看到:您好

我再说一遍,你在控制器中注入的是$get返回的内容,而不是其他方法。这就是为什么你不能在setState上使用run,因为你注入的是$get返回的内容。