如何在路由中使用空白 Ember 数据模型?

How to use a blank Ember Data model in a route?

我在以下内容中找不到太多内容,如果您有任何关于此的帖子或指南,我们将不胜感激!

我正在尝试使用表单和路由器创建新记录。我要解决这个问题的方法是在路由器中设置模型,然后在用户提交带有操作的表单时保存记录。

我见过其他示例,作者在控制器中执行 "createRecord" 并使用 "get" 或 "getProperties" 从表单中获取值。但是,在我下面的代码中,这似乎要简单得多:

Dashboard.CreateAccountRoute = Ember.Route.extend({
model: function() {
    return this.store.createRecord('account', {});
},
actions: {
    createAccount: function () {
        var account = this.modelFor('create_account');

        var self = this;
        account.save().then(function(account){
            self.flashMessage('The account was added successfully!', 'alert-success');
            self.transitionTo("accounts");
        }, function(reason) {
            self.flashMessage('There was an error saving the account. Please try again.', 'alert-error');
            console.log(reason);
        });
    }
}
});

当然,这个问题是,如果用户不提交表单,记录仍然会添加到本地存储中。否则,它将按表单记录中的预期设置值工作。

在操作 "createAccount" 之前,如何在不将任何内容保存到商店的情况下完成上述操作?

您可以使用路由的 deactivate 钩子来回滚您的模型。这是一个例子:

deactivate: function() {
  var model = this.get('controller.model');
  if (model != null) {
    model.rollback();
  }
}

您可以使用 willTransition 事件。这是我们应用程序中的真实示例:

App.FlavorNewRoute = Ember.Route.extend({
  setupController: function(controller) {
    var game = this.modelFor('game');
    var newFlavor = this.store.createRecord('flavor', {
      name: '',
      blueprintName: game.get('blueprintName'),
      organizationId: game.get('organizationId'),
      isArchived: false,
      isLocked: false,
      entries: []
    });
    controller.set('content', newFlavor);
  },

  actions: {
    willTransition: function(transition) {
      var flavor = this.controller.get('content');
      if(flavor.get('isNew') && flavor.get('isDirty')) {
        flavor.destroyRecord();
      }
    }
  }
});