我在应用程序中使用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


我猜是不对的...如何解决?
有什么建议么?

最佳答案

如果找不到_.findIndex,则可以返回-10是数组中的第一项,未找到-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-2myRouteSteps[-2]超出范围。

10-02 05:29