我在我的应用程序中使用UI-Router并检查状态顺序是否正确,我使用这样的代码:
.value('myRouteSteps', [
{ uiSref: 'myRoute.home', valid: true },
{ uiSref: 'myRoute.pageOne', valid: false },
{ uiSref: 'myRoute.pageTwo', valid: false },
])
.run([
'$rootScope',
'$state',
'myRouteSteps',
function ($rootScope, $state, myRouteSteps) {
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
var canGoToStep = false;
var toStateIndex = _.findIndex(myRouteSteps, function (myRouteStep) {
return myRouteStep.uiSref === toState.name;
});
console.log('toStateIndex', toStateIndex)
if (toStateIndex === 0) {
canGoToStep = true;
} else {
canGoToStep = myRouteSteps[toStateIndex - 1].valid;
}
console.log('canGoToStep', toState.name, canGoToStep);
// Stop state changing if the previous state is invalid
if (!canGoToStep) {
// Abort going to step
event.preventDefault();
}
});
}
]);
如果我进行缩小,我在第$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
行上会收到错误。
所以我已将其更改为$rootScope.$on('$stateChangeStart', ['event','toState','toParams','fromState','fromParams', function (event, toState, toParams, fromState, fromParams) {
然而我仍然遇到错误。
更新
当我看到缩小的代码时,我看到了这一点:
}]).run(["$rootScope", "$state", "orderSteps", function (n, t, i) {
n.$on("$stateChangeStart", function (n, t) {
var r = !1,
u = _.findIndex(i, function (n) {
return n.uiSref === t.name
不对我猜...怎么解决? 有什么建议吗?
答案 0 :(得分:1)
_.findIndex
可以在未找到的情况下返回-1
。 0
是数组中的第一个项目,找不到-1
。这会导致问题
if (toStateIndex === 0) {
canGoToStep = true;
} else {
canGoToStep = myRouteSteps[toStateIndex - 1].valid;
}
当toStateIndex
为-1
时,您将获得超出范围异常的索引。
你可能想要这样的东西:
if (toStateIndex < 0) {
canGoToStep = true;
} else {
canGoToStep = myRouteSteps[toStateIndex].valid;
}
解释如何发生这种情况...当您第一次加载页面时,UI路由器将转到''
状态,当它尝试转到''
时会触发$stateChangeStart
。 _.findIndex
''
找不到myRouteSteps
,toStateIndex
-1
成为-1
。 0
不等于else
,因此它位于-1 - 1
块中,-2
为myRouteSteps[-2]
,{{1}}超出范围。
答案 1 :(得分:0)
在我通过ng-annotate传递我的文件后,与原始文件的差异发现状态声明中缺少一个di注释。
我将从现在开始使用ng-annotate,而不是尝试自行转换我的Angular应用程序缩小安全。