我正在尝试使用Angular的路由来解析控制器范围的必要对象。我已经阅读了一些有关如何执行此操作的教程,但仍然出现Unknown Provider
错误。问题似乎是将project
注入ProjectDetailCtrl
。
app.js
var myApp = angular.module('myApp', ['ngRoute']);
myApp.config( function ($interpolateProvider, $routeProvider) {
$routeProvider
...
.when('/project/:projectId', {
templateUrl : 'partials/_project_detail.html',
controller: 'ProjectDetailCtrl',
resolve: {
project: function ($route, MyService) {
return MyService.get('projects/', $route.current.params.projectId).then(function(data) {
console.log('VERIFY DATA: ', data);
return data;
});
}
}
controllers.js
.controller('ProjectDetailCtrl', function ($scope, project) {
$scope.project = project;
}
services.js
.factory('MyService', function ($http, $q) {
var MyService = {
...
get: function (items_url, objId) {
var defer = $q.defer();
$http({method: 'GET',
url: api_url + items_url + objId}).
success(function (data, status, headers, config) {
defer.resolve(data);
}).error(function (data, status, headers, config) {
defer.reject(status);
});
return defer.promise;
},
问题显然不在于Service方法,因为这也会产生错误:
app.js
var myApp = angular.module('myApp', ['ngRoute']);
myApp.config( function ($interpolateProvider, $routeProvider) {
$routeProvider
...
.when('/project/:projectId', {
templateUrl : 'partials/_project_detail.html',
controller: 'ProjectDetailCtrl',
resolve: {
project: {title: 'foo'}
}
});
})
我可以验证我的解析函数是否正确返回,但Angular仍然抱怨project
未被识别。这是什么问题?我已经尝试将控制器转换为模块并将其传递给myApp模块,但我仍然对Unidentified Provider
产生了同样的project
问题。
注意:我使用的是Angular 1.2.9。
所以问题出在我的模板中这一行:
<!-- WRONG: <div ng-controller="ProjectDetailCtrl">-->
<div>
<h2 ng-show="project">Project: <strong>{{ project.title }}</strong></h2>
</div>
显然ng-controller
指令不能用于解决。
答案 0 :(得分:2)
您忘记添加ngRoute作为模块的依赖项。这就是为什么$ routeProvider和$ route服务未定义的原因。
<强>更新强>:
请参阅this示例。问题出现在ng-controller
指令
答案 1 :(得分:0)
您正在返回MyService.get,这是一个承诺,然后在承诺的结果中,您将返回数据....但是对于什么?
您希望返回承诺,但不是原始承诺...所以您使用$q
创建自己的承诺,Angular会在加载您的路线之前等待并为您解决。
project: function ($route, MyService) {
var deferred = $q.defer();
MyService.get('projects/', $route.current.params.projectId).then(function(data) {
console.log('VERIFY DATA: ', data);
deferred.resolve(data);
});
return deferred.promise;
}
或者,假设MyService.get返回一个promise,你应该能够做到
project: function ($route, MyService) {
return MyService.get('projects/', $route.current.params.projectId);
}
显然,将$q
注入配置
答案 2 :(得分:0)
这个问题已经asked before,因此它可能是重复的。
markup
或templates
,确切地说)ng-controller
这个词。ProjectDetailCtrl
它解决了我的问题。