AngularJS:通过解析实例化控制器时出错

时间:2015-05-27 08:53:24

标签: angularjs

我试图解决这个问题,试图解决需要注入控制器构造函数的数据时遇到的问题。控制器定义如下......

var dashboardCtrl = function ($scope, profile) {
    $scope.profile = profile;
    $scope.fullName = function () {
        if ($scope.profile == null)
            return null;

        return $scope.profile.firstName + " " + $scope.profile.lastName;
    }
}

注意它需要一个对象(profile)。这是控制器的注册方式......

var centralApp = angular.module("centralApp", ['ngRoute', 'ngCookies']);

centralApp.factory("accountsFactory", accountsFactory);
centralApp .controller("dashboardCtrl", ["$scope", "profile", dashboardCtrl]);

帐户工厂只需对后端RESTful服务执行与帐户相关的操作。然后,在应用程序的配置功能中,我已将路由定义如下......

var configFunc = function ($routeProvider, $httpProvider) {
    $routeProvider.
        when('/', {
            templateUrl: '/dashboard',
            controller: "dashboardCtrl",
            resolve: {
                profile: function (accountsFactory) {
                    return accountsFactory.profile();
                }
            }
        });
}

最后accountsFactory的定义如下......

var accountsFactory = function ($http, $q) {
    return {
        profile: function () {
            var deferred = $q.defer();

            $http.get("https://api.domain.com/profiles/me")
            .success(function (data) {
                deferred.resolve(data);
            })
            .error(function (data) {
                deferred.reject(data);
            });

            return deferred.promise;
        }
    };
}

accountsFactory.$inject = ["$http", "$q"];

现在,发生的事情是当控制器被实例化时,我得到以下错误......

  

https://docs.angularjs.org/error/ $注射器/ unpr?P0 = profileProvider   未知提供者:profileProvider

有趣的是,我可以看到profile包含我在使用Chrome的开发者工具时所期望的数据,但Angular仍然坚持认为出现了问题

问题

profileProvider来自何处? 为什么我可以在Chrome的开发者工具上看到profile确实是用数据实例化的?

我已经尝试过在SO上找到的不同方法但我无法通过这一点。 任何指针都将受到高度赞赏

1 个答案:

答案 0 :(得分:1)

您不需要在创建控制器的位置注入profile。路由器负责从您的解析函数中注入profile

您没有profileProvider,这就是您收到错误的原因。你有一个来自路由器的profile解析器。虽然注入两者都是不同的,但resolve中的函数对于该特定状态是本地的。

您应该在dependancy injection property $inject of your controller instead上注明profile

var dashboardCtrl = function ($scope, profile) {
    ...
}

dashboardCtrl.$inject = ['$scope', 'profile'];
centralApp .controller("dashboardCtrl", ["$scope", dashboardCtrl]);