正确的清理代码

Posted

技术标签:

【中文标题】正确的清理代码【英文标题】:Correct clean up code 【发布时间】:2013-01-25 18:58:02 【问题描述】:

我有以下两条路径用于编辑和新建:

WZ.ExercisesNewRoute = Em.Route.extend
  model: ->
    WZ.Exercise.createRecord()
  deactivate: ->
    @_super.apply this, arguments
    @get('currentModel.transaction').rollback()

WZ.ExercisesEditRoute = Em.Route.extend
  model: (params) ->
    WZ.Exercise.find(params.exercise_id)
  serialize: (params, options) ->
    exercise_id: params.get('id')
  deactivate: ->
    @_super.apply this, arguments
    tx = @get('currentModel.transaction')
    tx.rollback() if tx

我想知道每次停用时正确的代码应该是什么,以便在用户不保存、保存或其他情况下商店处于正确状态。

目前如果我路由到编辑路由,然后直接路由到新路由而不保存,我会收到以下错误:

未捕获的错误:尝试处理事件willSetProperty on 在 rootState.deleted.saved 状态下。 用 reference: [object Object], store: 调用, 姓名:姓名

【问题讨论】:

你的意思是在路线的出口处?您是否正在寻找这样的东西:***.com/questions/14797338/… 该错误专门发生在直接从编辑路由过渡到新路由然后尝试更改模型时。 嘿,这是一个老问题,但你有没有找到规范的方法来做到这一点? 我们有,但您可能不喜欢这个答案。我们停止直接处理 ED 模型,而是使用美化哈希,直到我们完全准备好坚持下去,例如用户按下保存。只有这样我们才能将哈希与 ED 模型同步并继续保存模型。这很有效,因为您不需要经常跑来跑去或试图跟踪交易。它有效,但我希望有更好的方法。 我在记录的所有新实例上调用deleteRecord。例如:github.com/collegedesis/collegedesis.com/blob/master/app/assets/… 【参考方案1】:

这个问题是针对旧版本的 ember 数据,但答案应该是首先检查 isDeleted 的状态,并且只有在记录尚未删除时才回滚。

在较新的 ember 数据中没有事务的概念,但如果您尝试回滚尚未持久化的记录,您仍然会遇到类似的问题。

我可能会在路由器 willTransition 事件中执行此操作,因为如果您想为用户提供保存更改的选项,您可以执行诸如中止转换之类的操作。

  willTransition: function(transition) 
    controller = this.get('controller')
    if( controller.get('content.isDirty') ) 
     if( controller.get('content.isNew') && confirm('Closing this window will revert all unsaved changes.') )
       controller.get('content').deleteRecord();
      else 
       controller.get('content').rollback()
     
    
  

【讨论】:

以上是关于正确的清理代码的主要内容,如果未能解决你的问题,请参考以下文章

在具有多个返回点的函数中清理的正确方法

中断事件循环后清理的正确方法是啥?

正确清理binlog日志

关闭和清理 Socket 连接的正确方法是啥?

FlinkFlink 清理过期 Checkpoint 目录的正确姿势

如何正确清理矢量/地图?