我正在尝试实施"通知未保存的已更改" 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();
}
});
出于某种原因,如果我导航到由同一个控制器实例管理的状态,则事件会被触发两次,因此我会被提示两次。
为什么会这样?我该如何预防?
答案 0 :(得分:2)
我没试过这个,但这是我们使用的模式。注册你的$ stateChangeStart(为了简单起见,我正在缩短它),但稍作修改:
const deregisterStateChangeStart =
this.$scope.$on('$stateChangeStart', this.foo.bind(this));
我假设您在控制器的$ onInit()中执行此操作。然后添加:
this.$scope.$on('$destroy', () => {
deregisterStateChangeStart();
});