Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 简单的角度$routeProvider解析测试。这个代码有什么问题?_Angularjs_Angularjs Directive_Angularjs Service_Angularjs Routing_Angularjs Controller - Fatal编程技术网

Angularjs 简单的角度$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标签中取

我创建了一个简单的Angular JS$routeProvider解析测试应用程序。它给出了以下错误:

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
    }
});