AngularJs:带有动态控制器名称的$ routeProvider不会加载

时间:2015-02-10 22:10:23

标签: javascript angularjs

AngularJs文档说你可以为控制器和放大器指定一个字符串或一个函数。配置$ routeProvider时路由对象中的templateUrl,但是当使用函数根据$ location参数动态确定控制器时,我遇到了问题。我有以下路由配置:

$routeProvider
       .when( '/workspace/:workspaceId/product/:productId/item/:itemType/:itemId/edit', {
        templateUrl: function ( param ) {
          switch ( param.itemType ) {
            case 'topic':
              return 'topic.tpl.html';
            case 'course':
              return 'course.tpl.html';
          }
          throw new Error( "Unknown product item type '" + param.itemType + "'" );
        },
        controller: function ( param ) {
          switch ( param.itemType ) {
            case 'topic':
              return 'TopicController';
            case 'course':
              return 'CourseController';
          }
          throw new Error( "Unknown product item type '" + param.itemType + "'" );
        }
      } );

加载应用程序时出现以下错误:

Error: [$injector:unpr] Unknown provider: paramProvider <- param

我错过了这里明显的一切吗?将控制器切换为使用字符串而不是函数可以解决问题。

看起来有些人之前遇到过这个问题(例如here),但是我很困惑为什么这不起作用,因为文档表明应该这样做。

非常感谢任何帮助!

约瑟夫。

1 个答案:

答案 0 :(得分:1)

我认为问题的一部分可能是当你向控制器提供一个函数而不是一个字符串时,它不是一个意味着返回一个控制器名称的函数 - 而是它的代替一个意味着充当控制者的功能。

瞥一眼以下内容 - 路由/动态控制器行为似乎有效。我使用$controller按名称实例化控制器。所以在这种情况下,我实际上并没有动态地返回一个不同的控制器,而是在我提供给$routeProvider的anon控制器中实例化一个新的控制器。

这是否是实现预期最终结果的最佳方式可能是另一回事。 ;)angular-ui / ui-router项目非常受欢迎。

&#13;
&#13;
angular.module('myApp', ['ngRoute'])
  .config(function($routeProvider) {
    $routeProvider
      .when('/workspace/:workspaceId/product/:productId/item/:itemType/:itemId/edit', {
        template: '<h1>{{title}}</h1><p>{{test}}</p>',
        controller: function($scope, $routeParams, $controller) {
          switch ($routeParams.itemType) {
            case 'topic':
              $controller('TopicController', {
                $scope: $scope
              });
              break;
            case 'course':
              $controller('CourseController', {
                $scope: $scope
              });
              break;
          }
        }
      })
      .when('/', {
        template: '<h1>Home</h1><p>{{test}}</p>',
        controller: 'home'
      });
  }).controller('home', function($scope) {
    $scope.test = 'Hello world.';
  }).controller('TopicController', function($scope) {
    $scope.title = "Topic";
    $scope.test = 'Success!';
  }).controller('CourseController', function($scope) {
    $scope.title = "Course";
    $scope.test = 'Success again!';
  });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.27/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.27/angular-route.min.js"></script>
<div ng-app="myApp">
  <a href="#/workspace/1/product/1/item/topic/1/edit">Topic</a>
  <a href="#/workspace/1/product/1/item/course/1/edit">Course</a>
  <div ng-view />
</div>
&#13;
&#13;
&#13;