在我的单页应用程序中,我需要保留状态历史记录,以便在状态之间来回导航。我有我自己的前进和后退按钮,我在我的页面上使用,而不是通过浏览器的按钮。管理UI路由器状态历史记录
这是下面的代码,我使用了我创建的服务来存储数组中的状态。
$rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
StateMgmtService.add(toState, toParams);
});
在服务上,我有话要以下的效果:
var history = [];
return {
previous: function() {
if (history && history.length > 0) {
return history[history.length - 1];
}
},
add: function (state, params) {
var historyItem = {
state: state,
parameters: params
};
history.push(historyItem);
}
};
的问题是,任何时候我回去到以前的状态,在stateChangeStart被激发,基本上污染我的历史。请看下面的例子:
- 从状态A到B的开始 - B被添加到历史
- B到C - ç被添加
- C返回到B - B被再次添加
这导致从b到c到b到c的无限循环...因此,我基本上不需要允许先前的项目被添加到历史中或以某种方式知道它将回到历史中,而是stateChangeStart不允许有任何区别。
帮助!
在我目前的应用程序中,只需使用不同的参数就可以处于相同的状态。例如, /page/2 /page/3 所以'page'是状态,2和3是参数。所以它必须比较状态和参数,这似乎是不必要的。 – whatsTheDiff
如果您只希望historyItem推入历史记录,如果先前状态与当前状态不相等,则可以在$ stateChangeStart函数作用域上添加验证。 $ rootScope.on('$ stateChangeStart',function(event,toState,toParams,fromState){ if(toState === fromState){ return; } – mtamma