我一直在看这些页面(1,2,3)。我基本上想改变我的$state
,但我不希望页面重新加载。
我目前在页面/schedules/2/4/2014
,我想进入编辑模式时,我点击一个按钮,并有URL成为/schedules/2/4/2014/edit
。
我的edit
状态仅仅是$scope.isEdit = true
,所以没有必要重新加载整个页面。但是,我确实希望更改$state
和/或url
,以便当用户刷新页面时,它以编辑模式开始。
我能做什么?
对于这个问题,您可以创建一个既没有templateUrl
也没有controller
的子状态,并在states
之间正常前进:
// UPDATED
$stateProvider
.state('schedules', {
url: "/schedules/:day/:month/:year",
templateUrl: 'schedules.html',
abstract: true, // make this abstract
controller: function($scope, $state, $stateParams) {
$scope.schedDate = moment($stateParams.year + '-' +
$stateParams.month + '-' +
$stateParams.day);
$scope.isEdit = false;
$scope.gotoEdit = function() {
$scope.isEdit = true;
$state.go('schedules.edit');
};
$scope.gotoView = function() {
$scope.isEdit = false;
$state.go('schedules.view');
};
},
resolve: {...}
})
.state('schedules.view', { // added view mode
url: "/view"
})
.state('schedules.edit', { // both children share controller above
url: "/edit"
});
这里的一个重要概念是,在ui-router
中,当应用程序处于特定状态时——当一个状态为"活动"时——它的所有祖先状态也隐式地处于活动状态。
在本例中,
- 当你的应用程序从视图模式进入编辑模式时,它的父状态
schedules
(以及templateUrl
,controller
甚至resolve
)仍然会被保留。 - 由于祖先状态是隐式激活的,即使子状态被刷新(或直接从书签加载),页面仍然会正确渲染。
REF: https://github.com/angular-ui/ui-router/wiki/Quick-Reference#statetransitiontoto-toparams--options
$state.transitionTo('yourState', params, {notify: false});
加上我的答案,因为我认为它与公认的答案足够不同,可能对其他人有用:
我有两个状态,begin
和view
,有一堆可选参数与view
的URL同步,如:
$stateProvider
.state('begin',
{
url: '/',
template: '<app-element></app-element>'
})
.state('view',
{
url: '/View?param1¶m2&...¶mN',
template: '<app-element></app-element>'
params: {
param1: {
value: null,
squash: true
},
...
}
});
<app-element>
的链接函数将在任何时候运行,我试图使用$state.go
同步参数。使用{notify: false, reload: false}
不适合我。每次链接函数仍然运行。我在0.2上,所以dynamic
也不是一个可用的参数选项。我听从了@b0nyb0y的建议,把它变成了父母和孩子的关系,这是有效的:
$stateProvider
.state('app',
{
url: '/',
template: '<app-element></app-element>'
})
.state('app.view',
{
url: 'View?param1¶m2&...¶mN',
params: {
param1: {
value: null,
squash: true
},
...
}
});