我可以基于$ stateParams管理动态控制器吗?

时间:2015-07-22 13:46:31

标签: angularjs angular-ui-router

我正在使用ui-router。我知道设置一个动态的templateUrl,但我想管理一个动态控制器。

以下是我正在寻找的内容:

KCachegrind

有可能做那样的事吗?我走错路了吗?

2 个答案:

答案 0 :(得分:1)

这就是我要做的事情:

$stateProvider
     .state('intermediary-state', {
              url:     '/',
              onEnter: ['$stateParams', '$state',
                function ($stateParams, $state) {
                  if ($stateParams.id === '1') {
                    $state.go('somewhere');
                  } else {
                    $state.go('somewhere-else');
                  }
                }]
            })
     .state('somewhere', {
              url:     '/somewhere',
              controller: 'SomewhereCtrl'
            })
     .state('somewhere-else', {
              url:     '/somewhere-else',
              controller: 'SomewhereElseCtrl'
            });

这背后的逻辑是我使用的中间状态只能抓取stateParams,进行相应的评估和重定向。

话虽这么说,但我不确定为什么你需要你的控制器基于stateParams动态化。这对我来说似乎也是一种代码味道,更好的选择是依赖于底层服务。

例如,你可能有一个不同的家庭"登录用户与来宾用户的状态/控制器,并且AuthenticationService负责该逻辑。

$stateProvider
     .state('intermediary-state', {
              url:     '/',
              onEnter: ['authenticationService', '$state',
                function (authenticationService, $state) {
                  if (authenticationService.isLoggedIn()) {
                    $state.go('home-user');
                  } else {
                    $state.go('home-guest');
                  }
                }]
            })

答案 1 :(得分:0)

我不认为对控制器这样做是个好主意。首先,

return "myFirstController";

不起作用,因为在评论中已经注意到了。你需要

$controller("myFirstController");

相反,它用于测试和黑客攻击,而不是用于琐碎的用法。考虑它的外观警告代码味道。

好处是您根本不需要在路由器中定义控制器,您可以使用ng-controller在模板文件中为视图选择合适的控制器。