Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 使用“后退”按钮返回时,不会放弃未保存的余烬数据模型_Ember.js_Ember Data_Back Button - Fatal编程技术网

Ember.js 使用“后退”按钮返回时,不会放弃未保存的余烬数据模型

Ember.js 使用“后退”按钮返回时,不会放弃未保存的余烬数据模型,ember.js,ember-data,back-button,Ember.js,Ember Data,Back Button,我有一个带有数据模型和常用CRUD视图/路线/控制器的ember应用程序,用于列出和添加新项目 当我从索引页面单击“添加新”时,我得到了预期的表单,带有“保存”和“取消”按钮。如果按“取消”,视图将返回到“索引”视图,并且模型不会按预期保存 这是新项目控制器的代码: App.ItemsNewController = Ember.ObjectController.extend({ actions: { saveChanges: function() { this.model

我有一个带有数据模型和常用CRUD视图/路线/控制器的ember应用程序,用于列出和添加新项目

当我从索引页面单击“添加新”时,我得到了预期的表单,带有“保存”和“取消”按钮。如果按“取消”,视图将返回到“索引”视图,并且模型不会按预期保存

这是新项目控制器的代码:

App.ItemsNewController = Ember.ObjectController.extend({
  actions: {
    saveChanges: function() {
      this.model.save();
      this.transitionTo('items');
    },
    cancel: function() {
      this.model.rollback(); // how to run this when the back button is pressed?
      this.transitionTo('items');
    },
  },
});
但是如果我按下后退按钮,我也会进入索引页面,但是索引列表中会出现一个额外的空行,对应于未保存在“new”视图中的新记录。此记录未持久化到数据层,但它仍以某种方式存在于内存中,而This.store.find'items'返回包含它的集合。如果刷新页面,空白行将消失。另外,如上所述,如果我使用cancel按钮退出表单,记录将被丢弃,因为在“cancel”操作方法中,我调用this.model.rollback

所以底线是,我想我必须在按下back按钮时回滚模型,但据我所知,没有路由回调来将一些代码挂接到这个事件


如果这很重要,我使用的是Ember 1.9.1、Ember Data 1.0.0-beta.15-canary、Handlebar 2.0.0、jQuery 1.10.2,这是我连续第二次发布到stackoverflow,我很快就找到了答案,所以我想我应该避免在这里提问,除非我真的不知所措和绝望

多亏了,我发现在路线上有一个退出活动。因此,解决这一问题的关键在于路线,而不是控制器。最后,我将模型回滚放在路由的退出事件方法中,如下所示:

更新:@NicholasJohn16指出,最好使用钩子,而不是退出。请参阅下面评论中的详细信息。代码示例已相应更改

App.ItemsNewRoute = Ember.Route.extend({
  model: function() {
    return this.store.createRecord('item', {
      title: 'Untitled',
      status: 'new',
    });
  },
  deactivate: function() {
    model = this.controllerFor('notifications.new').get('model');
    model.rollback();
  },
});

完成此操作后,您甚至可以从控制器中的cancel操作中删除model.rollback调用,只保留transitiono'items'调用。由于路线的停用事件将始终被调用,无论您以何种方式离开视图,该模型将始终被丢弃。

好吧,这是我连续第二次发布到stackoverflow,我很快就找到了答案,因此我想我应该避免在这里提问,除非我真的不知所措和绝望

多亏了,我发现在路线上有一个退出活动。因此,解决这一问题的关键在于路线,而不是控制器。最后,我将模型回滚放在路由的退出事件方法中,如下所示:

更新:@NicholasJohn16指出,最好使用钩子,而不是退出。请参阅下面评论中的详细信息。代码示例已相应更改

App.ItemsNewRoute = Ember.Route.extend({
  model: function() {
    return this.store.createRecord('item', {
      title: 'Untitled',
      status: 'new',
    });
  },
  deactivate: function() {
    model = this.controllerFor('notifications.new').get('model');
    model.rollback();
  },
});

完成此操作后,您甚至可以从控制器中的cancel操作中删除model.rollback调用,只保留transitiono'items'调用。由于路线的停用事件将始终被调用,无论您以何种方式离开视图,模型将始终被丢弃。

可能是更好的选择。感谢您的提示@NicholasJohn16。但你能简单地阐述一下两者的区别以及为什么更好吗?退出挂钩是私人财产。我不相信这意味着被推翻。然而,Deactivate是公共的,可以在同一manor.model.rollback中使用;现在是model.rollbackAttributes;我认为更好的是。当切换到使用相同路线的其他型号时,不调用deactivate,例如item/1/edit->item/2/edit可能是更好的选项。感谢@NicholasJohn16的提示。但你能简单地阐述一下两者的区别以及为什么更好吗?退出挂钩是私人财产。我不相信这意味着被推翻。然而,Deactivate是公共的,可以在同一manor.model.rollback中使用;现在是model.rollbackAttributes;我认为更好的是。当切换到使用相同路径的另一个模型时,不调用deactivate,例如item/1/edit->item/2/edit