在Ember 1.x中,如何在willTransition()中使用模态

时间:2016-03-09 19:14:14

标签: javascript ember.js

当有人试图离开具有不完整表单的页面时,我正在尝试打开模式对话框。我已经构建了模态模板,但我无法弄清楚如何实现它。这就是我所拥有的:

actions: {
    willTransition: function( transition ){
        var model = this.currentModel;

        if( model.get( 'isDirty' ) ){
            this.render( 'my-modal', {
                into: 'application',
                outlet: 'modal'
        } );
            if(!this.get(abortConfirmed) {
                transition.abort();
            } else {
               model.rollback();
            }
        }
    }
}

注意:脏检查有效,我可以生成提示,但这种模态不起作用

2 个答案:

答案 0 :(得分:1)

所以这就是我使用的工作流程。

1)。在willTransition(transition)钩子中,检查是否应该显示模态。

2)。如果您应该显示模态(在您的情况下,当模型isDirty时),请致电transition.abort()。您必须这样做以防止转换发生。您还需要控制器上的第二个属性来确定转换是否已获得授权。实际上,您检查model.get('isDirty) && this.controller.get('transitionAuthorized')

3)。您需要一种方法将状态传递给模态或模式,以便能够与创建模态的页面进行通信。我亲自将continueFncancelFn传递给关闭当前上下文的模态。像

这样的东西
var continueFn = this.createUnsavedDialogContinueFn(this, transition);

该功能是:

createUnsavedDialogContinueFn: function(context, transition){
        return function(){
            context.controller.set('transitionAuthorized', true);
            transition.retry();
        }
}

我将此continueFn传递给模式,其I don't care if I have Pending changes按钮通过操作调用。但是,如果您感觉更轻松,可以将此工作委托给控制器/路径。重要的是,您将transitionAuthorized设置为true并致电transition.retry()

4)。调用transition.retry会通过willTransition传回,但这次你将transitionAuthorized设置为true并且所有内容都会通过。

答案 1 :(得分:0)

您需要停止发生转换。在'isDirty'检查的底部添加transition.abort()。