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'方法,而不是使用指令.我在下面添加了一个答案.
您可以声明子状态继承的抽象父状态:
$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)
| 归档时间: |
|
| 查看次数: |
7569 次 |
| 最近记录: |