Angular UI路由器 - 默认参数

sma*_*sma 9 angularjs angular-ui angular-ui-router

无论如何使用Angular UI路由器为每个路由指定默认参数?

通过选择用户然后导航到我的应用程序,我的应用程序通过另一个应用程序的上下文输入.我的应用程序中的URL将始终在URL中具有用户ID,以便人们可以为URL添加书签,通过电子邮件发送等等.因此,当您浏览时,URL始终遵循以下方案:

#/{userId}/view/...
#/{userId}/edit/...
Run Code Online (Sandbox Code Playgroud)

等等

对于他们前往的任何路线,此appId对于应用内部的用户始终是相同的.如果他们碰巧退出,请返回主应用程序,选择一个新用户并返回我的应用程序,此userId将更改,但每个路径的值将相同.

无论如何从服务/工厂读取这个值,然后将其插入每个路由?

编辑:

我应该提一下,当我导航到一个状态时,我想避免在每个路由上显式设置此参数.例如,我不希望ui-sref="new-state({userId : blah})"每次导航到新状态时都要这样做.userId永远不会在我的应用程序的上下文中更改.

再次编辑:

我实际上是以不同的方式讨论了不必手动向每条路线发送'userId'的要求.我使用$ provide.decorator将此功能添加到'go'方法,而不是使用指令.我在下面添加了一个答案.

sca*_*rlz 7

您可以声明子状态继承的抽象父状态:

$stateProvider
  .state('user', {
     url: '/:userid',
     abstract: true,
     resolve: 
       // assuming some kind of User resource factory
       currentUser: function($stateParams, User) {
         return User.get($stateParams.userid);
       }
     }
   })
  .state('user.view', {
     url: '/view', // actual url /:userid/view
     controller: function($scope, currentUser) {
       // currentUser resource available
     }
   });
  .state('user.edit', {
     url: '/edit', // actual url /:userid/edit
     controller: function($scope, currentUser) {
       // currentUser resource available
     }
   });
Run Code Online (Sandbox Code Playgroud)

在导航到州时,您需要传入所需的用户:

$state.go('user.view', {userid: 'myuserid'});
Run Code Online (Sandbox Code Playgroud)

因此,.go()在currentUser服务上创建某种包装器方法可能是有意义的,因此您不必每次都指定用户ID.

更新:

要解决编辑中发布的问题,您可以引入如下指令:

angular.module('app')
  .directive('userSref', function($state) {               
     return function(scope, elem, attrs) {
       var state = 'user.' + attrs.userSref;

       elem.bind('click', function() {
         $state.go(state, {userid: $state.params.userid});
       });           

       scope.$on('$destroy', function() {
         elem.unbind('click');
       });
     };
  });
Run Code Online (Sandbox Code Playgroud)

然后,任何将来基于用户的状态的链接都可以通过以下方式完成:

<a user-sref="view">View User</a>
Run Code Online (Sandbox Code Playgroud)