使用$ scope.on('$ stateChangeStart')

时间:2016-10-27 19:31:25

标签: angularjs angular-ui-router

在用户离开当前状态之前,我想提示他们保存他们的工作。我在$stateChangeStart上有一个监听器,但问题是,在用户确认他们希望离开当前状态后,他们再次得到提示并且不能离开,因为监听器一直在拦截状态变化。我尝试传递一个布尔参数,所以我可以检查他们是否确认了他们离开的意图,但它没有通过。

        $scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams, options) {
            console.log('toState: ');
            console.log(toState);
            console.log('toParams: ');
            console.log(toParams);
            console.log('fromState: ');
            console.log(fromState);
            console.log('fromParams: ');
            console.log(fromParams);
            console.log('options: ');
            console.log(options);

            //if (!isExitConfirmed) {
                event.preventDefault();
                ModalFactory.OpenTwoActionModal('EventFooterTwoActionModal',
                    'Exit Event', 'Are you sure you want to exit? Any unsaved changes will be lost.',
                    'Exit', function() { $state.go(toState, { isExitConfirmed: true }); },
                    'Cancel', function() {});
            //}
        });

我已登录到控制台toStatetoParamsfromStatefromParamsoptions,但其中没有一个包含isExitConfirmed

我在这里错过了什么,或者我是以错误的方式解决这个问题?

2 个答案:

答案 0 :(得分:0)

我建议你在状态提供程序配置中使用resolve而不是监听事件。事件处理程序总是不好用,因为它会导致内存泄漏。

在调用stage.go()之前,调用弹出窗口来保存数据。一旦用户确认,保存标志。访问该标志以解决状态提供程序配置中的下一个路由更改。

答案 1 :(得分:0)

使用$ q服务中的延迟对象以及相关的承诺。 承诺只能消费一次,可以解决或拒绝承诺。