【问题标题】:AngularJs: $routeProvider with dynamic controller name won't loadAngularJs:具有动态控制器名称的 $routeProvider 不会加载
【发布时间】:2015-02-10 22:10:23
【问题描述】:

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

$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),但我很困惑为什么这不起作用,因为文档表明它应该这样做。

任何帮助将不胜感激!

约瑟夫。

【问题讨论】:

  • param 来自哪里,你想做什么?为什么你不能为他们创建两条路线而不是动态路线?
  • 我认为 Angular 提供了它(与 templateUrl 的方式相同)?创建两条路线绝对是一种选择,但我认为我也可以这样做。
  • param 可能意味着$routeParams
  • 将其设置为 $routeParams 可以消除错误,但不会加载命名控制器。看起来如果您提供一个函数,那么 Angular 会尝试将该函数用作控制器,而不是使用它来提供控制器名称
  • 尝试在 -function ( param ) { switch ( param.itemType ) { case 'topic': return 'TopicController';案例“课程”:返回“课程控制器”; }()

标签: javascript angularjs


【解决方案1】:

我认为问题的一部分可能是,当您向控制器提供函数而不是字符串时,它不是旨在返回控制器名称的函数 - 它是旨在充当控制器的函数。

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

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

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

【讨论】:

  • 我注意到我的答案与您提供的链接中的一个非常相似:stackoverflow.com/a/22885416/446030。在此答案下的评论中指出,如果您需要,显然这可能会导致解决问题。因此,也许使用 angular-ui/ui-router 运行会为您提供更多所需的灵活性,同时减少权衡。
  • 感谢您的详细解答!暂时会用这个,也会看看 ui-router。
猜你喜欢
  • 2013-08-27
  • 2013-07-14
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多