数据交易和重新提交表格

我使用的是ember(+ data),并且构建了一个简单的注册表单,但是在服务器端验证错误之后,我无法使表单(和ember-data事务)正常工作。

我遵循https://github.com/dgeb/ember_data_example作为如何使用事务的指南,它主要用于快乐路径,但在服务器端验证错误后,我无法获取余烬数据当我点击提交时重新提交API请求。

我做了一些挖掘,并且我认为在模型失效或类似事件后,我错过了一些与重置交易有关的步骤......

Github和App

您可以尝试应用程序并在http://emb.herokuapp.com/上重现该问题。

您也可以在https://github.com/justinfaulkner/ember-data-resubmit查看完整的源代码

摄制

您可以使用@ example.com上的电子邮件地址填写我的应用程序中的表单,从而触发假的服务器端错误。 Rails API将响应422以及键入用户名/电子邮件字段的错误对象。

该字段应以红色突出显示,并出现错误 - 将电子邮件地址编辑为应该有效的内容,然后再次单击提交。 在chrome中打开开发人员工具时,我看不到用点击发送http请求的ember-data(但控制器中的console.log指示确实正在接收点击)。

应该发生什么

与错误修正后场,烬数据(我认为)改变从模型的invaliduncommitted ,以便它被提交下一次commit被调用。 当我点击Submit时,ember-data应该发送HTTP请求到我的api,并且ember应该转换到“Congrats!” 页。

然而,形式只是坐在那里。 没有http请求。 没有过渡到“恭喜!”。

在点击更新输入之后点击提交几次(18)后,以下是一个屏幕截图:

提交按钮点击收到,但没有http请求

片段

以下是我的烬宝应用程序的一些片段:

IndexRoute

我的路线,它使用像ember_data_example startEditing

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return null;
  },
  setupController: function(controller) {
    controller.startEditing();
  },
  deactivate: function() {
    this.controllerFor('index').stopEditing();
  }
});

的IndexController

我的IndexController是在ember_data_example的ContactsNewController之后建模的

App.IndexController = Ember.ObjectController.extend({
  startEditing: function() {
    this.transaction = this.get('store').transaction();
    this.set('content', this.transaction.createRecord(App.User));
  },
  submit: function(user){
    console.log("submitting!");
    this.transaction.commit();
    this.transaction = null;
  },
  _transitionOnSuccess: function(stuff) {
    if (this.get('content.id') && this.get('content.id').length > 0) {
      console.log("_transitionOnSuccess");
      this.transitionToRoute('success');
    }
  }.observes('content.id'),
  stopEditing: function() {
    if (this.transaction) {
      this.transaction.rollback();
      this.transaction = null;
    }
  }
});

用户

这是我的模型。 我正在使用烬验证。

App.User = DS.Model.extend(Ember.Validations.Mixin);
App.User.reopen({
  username: DS.attr('string'),
  password: DS.attr('string'),
  profile: DS.belongsTo('App.Profile'),

  validations: {
      username: {
          presence: true
      },
      password: {
          presence: true,
          length: { minimum: 6 }
      }
  }
});

index.hbs

这里是我的车把模板的形式。 我正在使用ember-easyForm。

{{#formFor controller}}
    <div class="row">
        <div class="large-12 columns">
            {{input username placeholder="Email address"}}
        </div>

    </div>

    <div class="row">
        <div class="large-12 columns">
            {{input password placeholder="Password"}}
        </div>
    </div>

    {{submit "Sign Up" class="button"}}
{{/formFor}}

如果库作者看到这篇文章,我已经在这个提交中对应用程序的ember-easyForm副本和ember-validation进行了一些本地修改:https://github.com/justinfaulkner/dockyard-example/commit/f618b0e4fb72314d56bb3a9d95e1325925ba6ad0。 不过,我认为我的更改不会导致我的问题。

变成无效和回滚?

我在这里遇到了一个类似的问题:Ember Data和脏记录,但是当我添加一个User.becameInvalid来回滚事务时,这会导致表单在尝试重新提交时为空(并且仍然没有成功使用ember-data重新提交http请求)。

谢谢!

我确定我很难跟随ember_data_example (或者没有把它扩展到我的用例),或者在某个地方犯了一些简单的错误......

提前致谢。

4月5日编辑

到目前为止,我可以发现至少两个主要问题:

  • this.transaction = null; 我需要这个吗? 我该怎么做呢?
  • 我试过删除this.transaction = null; 并且ember-data尝试实际提交(但仍不会提交ajax请求)。 现在,当我输入无效字段时,我可以看到ember-data尝试将记录更新回uncommitted /已created ... 但它在不同的事务中执行
  • 我推出了一个no-null分支到回收站,它在ember-data中有一些console.log ,用于输出事务ID是什么......这是我的控制台的快照:

    不同的交易

    当我输入字段时, recordBecameDirty被调用。 Ember-data更新记录以准备再次提交。 但是,这是在一些其他交易中做的(458)

    但我的提交按钮绑定到原始事务(316),并且没有记录准备好在该事务中提交....嗯....


    这是一个有关烬数据的已知问题。 请参阅:https://github.com/emberjs/data/pull/539

    在提交https://github.com/Cyril-sf/data/commit/fe9c63beb02e9f16051e59a9f7c0a918152a0231 Ember数据中的简单更改应该可以解决您的问题。

    链接地址: http://www.djcxy.com/p/64073.html

    上一篇: data transactions and resubmitting forms

    下一篇: Ember model lifecycle, and reverting to original state