Ember 2.12中如何销毁并重建Coapplicant控制器对象
在Ember 2.12中重置共同申请人控制器状态的正确方式
嘿,我完全理解你现在的困扰——想通过销毁coapplicant控制器来彻底清除它的状态,但Ember 2.x里控制器默认是单例模式,框架会复用这些实例,强行销毁反而可能引发后续路由切换时的意外问题。咱们换个更稳妥、符合Ember设计思路的方案来解决:
1. 优先选择重置状态,而非销毁控制器
既然Ember倾向于复用控制器实例,不如在控制器内部定义一个专门的重置方法,直接清空所有需要清除的状态属性,这比销毁实例更安全:
// app/controllers/coapplicant.js import Ember from 'ember'; export default Ember.Controller.extend({ // 你的共同申请人状态属性 coapplicantInfo: null, isCoapplicantActive: true, someTempState: '', // 定义状态重置方法 resetCoapplicantState() { this.setProperties({ coapplicantInfo: null, isCoapplicantActive: false, someTempState: '' // 把所有需要清除的状态属性都列在这里 }); } });
2. 在路由中调用重置方法
你已经在resetController钩子中操作,那可以直接在这里获取coapplicant控制器实例并调用重置方法;如果是用户触发删除动作时重置,也可以在路由的action中处理:
// app/routes/form.js import Ember from 'ember'; export default Ember.Route.extend({ resetController(controller, isExiting) { // 离开表单路由时自动重置共同申请人状态 if (isExiting) { const coapplicantCtrl = this.controllerFor('coapplicant'); coapplicantCtrl.resetCoapplicantState(); } }, actions: { deleteCoapplicant() { // 先处理删除共同申请人的业务逻辑(比如调用API、更新模型) // ... // 业务完成后重置控制器状态 const coapplicantCtrl = this.controllerFor('coapplicant'); coapplicantCtrl.resetCoapplicantState(); } } });
3. 真要销毁控制器?(不推荐但可实现)
如果你坚持要销毁控制器实例,Ember 2.x可以通过容器注销实例,但要注意这可能影响其他依赖该控制器的路由/组件:
// 在路由的action或resetController中执行 const container = this.get('container'); container.unregister('controller:coapplicant'); // 下次调用controllerFor时会重新创建新的控制器实例
4. 最佳实践:把状态移到服务/数据模型中
你提到“该状态本应存于独立数据对象”,这其实是更符合Ember设计的思路——把状态从控制器(路由绑定的临时容器)移到专门的服务或数据模型里,状态管理会更清晰,重置也更简单:
// app/services/coapplicant-state.js import Ember from 'ember'; export default Ember.Service.extend({ currentCoapplicant: null, reset() { this.set('currentCoapplicant', null); } });
之后在控制器和路由中注入这个服务,直接通过服务来读写和重置状态,完全摆脱控制器单例的限制。
内容的提问来源于stack exchange,提问作者Robin Bajaj
相关产品推荐
相关产品推荐

