Ember事件可在同一路线之间进行最佳丢弃更改

Eve*_*nos 5 ember.js ember-data

我有一个Ember列表和一个编辑表单.每次更改列表的选定项目时,编辑表单将丢弃所有更改并加载新模型.

我的问题是没有办法放弃更改,因为停用事件不会触发.

例如,从url/favs/123/editurl/favs/456/edit激活(和退出)事件不会触发.因此无法正确丢弃任何更改.

这是我所指的代码的一部分:

App.Router.map(function() {
    this.resource('favs', { path: '/favs' }, function() {
        this.route('new');
        this.route('edit', { path: ':fav_id/edit' })
    });
});

[...]

App.FavsEditRoute = Ember.Route.extend({
    deactivate: function() {
        var model = this.get('currentModel');
        if(model && model.get('isDirty')) {
            model.get('transaction').rollback();
        }
    },

    model: function(params) {
        return App.Fav.find(params.fav_id);
    },
});
Run Code Online (Sandbox Code Playgroud)

Gre*_*olm 4

我建议使用 willTransition 路由操作。目前,它似乎在 Ember 指南中被宣传为解决方案:

https://guides.emberjs.com/release/routing/preventing-and-retrying-transitions/

除了在公共 API 中之外,此方法的优点是您可以提示用户确认他们是否确实想要放弃更改,如果他们拒绝,则使转换无效。

例如:

App.FavsEditRoute = Ember.Route.extend({
  ...
  actions: {
    willTransition: function(transition) {
      controller = this.controllerFor('fav');
      if (controller.get('isDirty') &&
          !confirm("Are you sure you want to abandon progress?")) {
        transition.abort();
        return false;
      } else {
        controller.get("content").rollback();
        return true;
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)