如何在Ember框架中销毁和重新创建控制器对象

时间:2018-02-08 23:39:21

标签: ember.js

我使用的是Ember 2.12,有两个控制器 - 一个用于申请人,另一个用于申请流程的共同申请人。当用户决定删除coapplicant时,我试图摆脱它的状态(不幸的是,它存在于coapplicant控制器而不是单独的数据对象)。所以我试图破坏控制器,然后在下次加载页面时重新创建它。

在resetController状态下,我调用

this.destroy();

在routes / form.js页面的

setupController(controller,model)

我正在检查控制器是否被销毁,我试图重新创建它

if (controller.isDestroyed) {
        Ember.Logger.error('controller is already destroyed');
        this.set('controller',FormEditCoapplicantController.create());
    }
    this._super(...arguments);

但是当我这样做时,我会在调用this._super(... arguments)时收到错误,

Error while processing route: form-edit-coapplicant Assertion Failed: calling set on destroyed object: <account-open@controller:form-edit-coapplicant::ember3345>.model = [object Object] Error: Assertion Failed: calling set on destroyed object: <account-open@controller:form-edit-coapplicant::ember3345>.model = [object Object]
at assert (http://localhost:4200/assets/vendor.js:21056:13)
at Object.assert (http://localhost:4200/assets/vendor.js:32807:34)
at Object.set (http://localhost:4200/assets/vendor.js:37553:22)
at Class.setupController (http://localhost:4200/assets/vendor.js:42366:21)
at Class.setupController (http://localhost:4200/assets/vendor.js:207076:9)
at Class.superWrapper (http://localhost:4200/assets/vendor.js:55946:22)
at Class.setupController (http://localhost:4200/assets/account-open.js:6331:16)
at Class.superWrapper [as setupController] (http://localhost:4200/assets/vendor.js:55946:22)
at Class.setupController (http://localhost:4200/assets/account-open.js:7184:16)
at Class.superWrapper [as setupController] (http://localhost:4200/assets/vendor.js:55946:22)

我在这里找不到任何东西。

我不想通过手动重置每个字段来清除控制器状态,因为它的逻辑非常复杂(有很多字段,有些是计算属性,有些是有条件预填充/未预先填充,具体取决于数据可用性,我假设如果我能以某种方式破坏并重新创建控制器,在这种情况下,我可以得到全新创建的控制器,其状态恢复原状,无需太多的手动操作。

2 个答案:

答案 0 :(得分:1)

不要破坏控制器。在恩伯,控制者是单身人士。每条路线都有它自己的控制器(如果你不自己定义它,Ember会为你创建一个)。删除控制器对象本身很可能导致应用程序功能失常。

显然,你有一个状态在控制器中保存的对象。使用setupControllerwillTranstion函数手动重置主对象。计算属性会自动出现。

答案 1 :(得分:1)

Ember没有办法重新创建控制器。当用户导航到此路线或从此路线导航时,您可以使用相应路线的didTransitionwillTransition操作来重置状态。你也可以使用refresh,就像用户&#34;重新访问&#34;路线。但是我也确定你的控制器可以而且应该通过移动所有&#34;设置&#34;来重构。用于分隔您可以随时调用的方法的代码。