UI-Router States:如何使用$ rootScope。$ on minification safe制作app.run

时间:2015-04-23 08:00:12

标签: javascript angularjs angular-ui-router bundling-and-minification

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

不对我猜...怎么解决? 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

_.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 ''找不到myRouteStepstoStateIndex -1成为-10不等于else,因此它位于-1 - 1块中,-2myRouteSteps[-2],{{1}}超出范围。

答案 1 :(得分:0)

在我通过ng-annotate传递我的文件后,与原始文件的差异发现状态声明中缺少一个di注释。

我将从现在开始使用ng-annotate,而不是尝试自行转换我的Angular应用程序缩小安全。