20

我正在尝试执行异步 http 请求以在我的应用程序加载之前加载一些数据,因此我在 $routeProvider 中使用了一个解析,这是我的 MainController 中的一个 http 请求。出于某种原因,我不断收到Error: [$injector:unpr] Unknown provider: appDataProvider <- appData其中 appData 是我执行 http 请求的位置。我正在使用 AngularJS v 1.2.5。

这是我尝试过的代码和两种方法,它们都给出了相同的错误:

方法#1

主控制器.js

var MainController = ['$scope','$location','appData',
    function($scope, $location, appData){
       console.log(appData.data);
    }
];

MainController.loadData = {
    appData: function($http, $location, MainFactory){
        var aid = MainFactory.extractAid($location);
        return $http({method: 'GET', url: URL_CONST + aid});
    }
};

应用程序.js

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

app.config(function($routeProvider) {
  $routeProvider
    .when('/', {
      redirectTo: '/pages/alerts'
    })
    .when('/pages/:pageName', {
        templateUrl: function(params) {
            return 'views/pages/' + params.pageName + '.html';
        },
        controller: MainController,
        resolve: MainController.loadData
    })
    .otherwise({
        redirectTo: '/pages/alerts'
    });
});

我尝试更改名称以防它是一个冲突的系统保留关键字但没有运气。由于某种原因,appData永远无法识别

方法 #2 我也尝试像这样改变它:

应用程序.js

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

app.config(function($routeProvider) {
  $routeProvider
    .when('/', {
      redirectTo: '/pages/alerts'
    })
    .when('/pages/:pageName', {
        templateUrl: function(params) {
            return 'views/pages/' + params.pageName + '.html';
        },
        controller: MainController,
        resolve: {
                appData: ['$http', '$location','MainFactory', function($http, $location, MainFactory) {
                    var aid = MainFactory.extractAid($location);
                    return $http({method: 'GET', url: URL_CONST + aid});
                }]
        }
    })
    .otherwise({
        redirectTo: '/pages/alerts'
    });
});

主控制器.js

var MainController = ['$scope','$location','appData',
    function($scope, $location, appData){
        console.log(resolvedData);
    }
];

然而,结果完全一样。这与 angular 1.2.5 有关吗?

这是其他人的工作版本

http://mhevery.github.io/angular-phonecat/app/#/phones

这是代码:

function PhoneListCtrl($scope, phones) {
  $scope.phones = phones;
  $scope.orderProp = 'age';
}

PhoneListCtrl.resolve = {
  phones: function(Phone) {
    return Phone.query();
  },
  delay: function($q, $defer) {
    var delay = $q.defer();
    $defer(delay.resolve, 1000);
    return delay.promise;
  }
}

angular.module('phonecat', ['phonecatFilters', 'phonecatServices', 'phonecatDirectives']).
  config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/phones', {templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl, resolve: PhoneListCtrl.resolve}).
        otherwise({redirectTo: '/phones'});
  }]);
4

3 回答 3

2

这是我在我正在处理的应用程序中使用的代码示例,不确定它会有多大帮助,因为它与您已经拥有的方式没有太大区别。

路由

.when('/view/proposal/:id',{
    controller : 'viewProposalCtrl',
    templateURL : 'tmpls/get/proposal/view',
    resolve : viewProposalCtrl.resolveViewProposal
})

控制器

var viewProposalCtrl = angular.module('proposal.controllers')
    .controller('viewProposalCtrl',['$scope','contacts','details','rationale',
        function($scope,contacts,details,rationale){
            $scope.contacts = contacts;
            $scope.details = details;
            $scope.rationale = rationale;

            // [ REST OF CONTROLLER CODE ]
        });


// proposalSrv is a factory service

viewProposalCtrl.resolveViewProposal = {
    contacts : ['$route','proposalSrv',function($route,proposalSrv){
        return proposalSrv.get('Contacts',$route.current.params.id)
           .then(function(data){
               return data.data.contacts;
           },function(){
               return [];
           });
    }],
    details : ['$route','proposalSrv',function($route,proposalSrv){
        return proposalSrv.get('Details',$route.current.params.id)
            .then(function(data){
                return data.data.details;
            },function(){
                return {};
            });
    }],
    rationale : ['$route','proposalSrv',function($route,proposalSrv){
        return proposalSrv.get('Rationale',$route.current.params.id)
            .then(function(data){
                return data.data.rationale;
            },function(){
                return {};
            ]
    }]
};

现在我想起来了,当我开发我的应用程序时,我确实遇到了一个问题,不知道为什么当我将解析函数命名为“resolve”时。这给了我一个问题:

.when('/path',{
     // stuff here
     resolve : myCtrlr.resolve
})

但这没有:

.when('/path',{
     //stuff here
     resolve : myCtrlr.myResolveFn
})

另一种可能性

我唯一能想到的另一件事是,您正在从调用中返回承诺$http,然后尝试使用appData.dataTry using the .thenfunction 或其他函数之一 ( .success, .error) 从 Promise 中检索信息。

于 2013-12-18T15:57:39.377 回答
1

问题不是因为之前使用了不同版本的 AngularJS。

这是使用我上面的代码进行的修复。

在 app.js 中,您需要将控制器声明为控制器:'MainController'而不是控制器:MainController,即使您有 var MainController = app.controller('MainController', ....)。

第二个也是最重要的事情是,在我的 index.html 中,我已经像这样声明了我的控制器:

索引.html

正文 ng-app="HEY" 控制器="MainController" /body

这导致了整个 Unknown provider 错误 显然,角度不会告诉您您已经声明了用于解析它的控制器,这将导致一个与解析无关的奇怪错误。

我希望这对可能有同样问题的人有所帮助。

于 2018-02-25T05:14:47.453 回答
0

我在 Angular 1x 文档中注意到的一件事是,您没有将解析的参数指定为带注释的依赖项

所以这:

.when('/somewhere', {
  template: '<some-component></some-component>',
  resolve: {
    resolvedFromRouter: () => someService.fetch()
  }
})

export default [
  '$scope',
  'someService',
  'resolvedFromRouter'
  Controller
]

function Controller($scope, someService, resolvedFromRouter) {
  // <= unknown provider "resolvedFromRouter"
}

是错的。您没有在文档中将已解析的参数指定为依赖项:

为了更容易地从模板访问已解析的依赖项,解析映射将在路由范围内可用,在 $resolve (默认情况下)或由 resolveAs 属性指定的自定义名称下(见下文)。这在将组件用作路由模板时特别有用。

所以只需这样做:

.when('/somewhere', {
  template: '<some-component></some-component>',
  resolve: {
    resolvedFromRouter: () => someService.fetch()
  }
})

export default [
  '$scope',
  'someService',
  Controller
]

function Controller($scope, someService) {
  $scope.$resolve.resolvedFromRouter; // <= injected here
}
于 2017-02-08T18:16:38.647 回答