stateChangeStart事件每个控制器实例调用两次

时间:2017-08-24 09:45:44

标签: angularjs angular-ui-router

我正在尝试实施"通知未保存的已更改" angularjs中的解决方案。

基本上我有一个BaseForm控制器,我在那里听stateChangeStart事件。当我被解雇时,我会检查公司是否脏,以及在提示时,用户是否确认更改位置。如果他不比我preventDefault()。 以下是我用来实现此目的的代码:

this.$scope.$on('$stateChangeStart', (event, toState, toParams, fromState, fromParams) => {
        let dirtyForms = this.detailForms.filter((form) => { if (form) { return form.$dirty } });
        if (dirtyForms.length && !confirm("Are you sure to leave this page?")) {
            event.preventDefault();
        }                
});

出于某种原因,如果我导航到由同一个控制器实例管理的状态,则事件会被触发两次,因此我会被提示两次。

为什么会这样?我该如何预防?

1 个答案:

答案 0 :(得分:2)

我没试过这个,但这是我们使用的模式。注册你的$ stateChangeStart(为了简单起见,我正在缩短它),但稍作修改:

const deregisterStateChangeStart =
  this.$scope.$on('$stateChangeStart', this.foo.bind(this));

我假设您在控制器的$ onInit()中执行此操作。然后添加:

this.$scope.$on('$destroy', () => {
  deregisterStateChangeStart();
});