Angularjs 简单的角度$routeProvider解析测试。这个代码有什么问题?
我创建了一个简单的Angular JS$routeProvider解析测试应用程序。它给出了以下错误:Angularjs 简单的角度$routeProvider解析测试。这个代码有什么问题?,angularjs,angularjs-directive,angularjs-service,angularjs-routing,angularjs-controller,Angularjs,Angularjs Directive,Angularjs Service,Angularjs Routing,Angularjs Controller,我创建了一个简单的Angular JS$routeProvider解析测试应用程序。它给出了以下错误: Error: Unknown provider: dataProvider <- data rt.html <span>{{data}}</span> {{data} 问题在于,index.html中的body标记上有ng controller=“ResolveCtrl”,而$routeProvider中也为rt.html指定了相同的控制器。从body标签中取
Error: Unknown provider: dataProvider <- data
rt.html
<span>{{data}}</span>
{{data}
问题在于,index.html中的body标记上有ng controller=“ResolveCtrl”
,而$routeProvider中也为rt.html指定了相同的控制器。从body标签中取出控制器定义,让$routeProvider处理它。在这之后,它工作得很好。通过向控制器的定义中添加数据,可以告诉您希望在这里注入服务或工厂,但您没有数据服务或工厂,因此会出现错误。要使用数据变量,您可以从$scope.data
行获得所需的所有信息。因此,要解决这个问题,您需要从控制器调用中删除数据注入
var rt = angular.module("ResolveTest",[]);
rt.config(["$routeProvider",function($routeProvider)
{
$routeProvider.when("/",{
templateUrl: "rt.html",
controller: "ResolveCtrl",
resolve: {
data: ["$q","$timeout",function($q,$timeout)
{
var deferred = $q.defer();
$timeout(function()
{
deferred.resolve("my data value");
},2000);
return deferred.promise;
}]
}
});
}]);
rt.controller("ResolveCtrl",["$scope", function($scope)
{
$scope.data = "";
}]);
如果您想让数据提供者添加一个工厂,比如
rt.factory('data', ['$http', function($http){
return {
// Functions to get data here
}
}]);
然后在控制器中,从该工厂调用相应的函数
另外,正如其他人指出的,在路由和ng控制器中都不需要控制器(如果检查作用域,这将使控制器嵌套在控制器中)
如果必须使用resolve,则仍然需要一个工厂,因为resolve将只指向需要单独声明的正确工厂。根据定义,resolve对象是从键(依赖项名称)到工厂函数或现有服务名称的映射。请尝试以下方法:
var myFactory = function($q, $timeout) { ... };
myFactory.$inject = ['$q', '$timeout'];
$routeProvider.when("/",{
templateUrl: "rt.html",
controller: "ResolveCtrl",
resolve: {
data: myFactory
}
});
robbymurphy-您没有在小提琴中解析或注入结果,因此您没有正确地复制问题。@CM您是对的,我的印象是您认为不能在路由和标记中同时指定控制器。来自AngularJS$routeProvider doc for resolve:factory-{string | function}:如果为字符串,则它是服务的别名。否则,如果为函数,则注入该函数,并将返回值视为依赖项。如果结果是承诺,则在将其值注入控制器之前对其进行解析。如果resolve是返回承诺的函数,则解析后将其注入控制器。
rt.factory('data', ['$http', function($http){
return {
// Functions to get data here
}
}]);
var myFactory = function($q, $timeout) { ... };
myFactory.$inject = ['$q', '$timeout'];
$routeProvider.when("/",{
templateUrl: "rt.html",
controller: "ResolveCtrl",
resolve: {
data: myFactory
}
});