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

how to destroy and recreate a controller object in Ember framework

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

在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)

这里有什么我遗漏的吗?

我不想通过手动重置每个字段来清除控制器状态,因为这样做的逻辑非常复杂(有很多字段,有些是计算属性,有些有条件 prefilled/not-prefilled 取决于数据可用性,我假设在这种情况下,如果我能以某种方式销毁并重新创建控制器,我可以将全新创建的控制器的状态恢复到原始状态,而无需太多手动操作。

不要破坏控制器。在 Ember 中,控制器是单例。每条路线都有自己的控制器(如果您没有自己定义,Ember 会为您创建一个)。删除控制器对象本身很可能会导致应用程序无法正常工作。

显然,您得到了一个对象,其状态保存在控制器中。使用 setupControllerwillTranstion 函数手动重置主对象。计算属性会自动进行。

Ember 无法重新创建控制器。您可以使用 didTransition or willTransition actions of according route to reset state when user navigates to or from this route. You can also use refresh ,它就像用户 "revisits" 路由一样。但我也确信您的控制器可以而且应该通过将所有 "setup" 代码移动到您可以随时调用的单独方法来重构。