我有一段时间一直在努力奋斗; 让我们看看是否有人可以帮助我.
虽然在自述文件中没有明确说明,但是ember-data提供了一些验证支持.您可以在代码和文档的某些部分看到:
https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L411
https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L529
REST适配器本身不添加验证支持,但我发现如果我在ajax调用中添加这样的东西,我可以使用来自服务器端的errors对象将模型置于"无效"状态:
error: function(xhr){
var data = Ember.$.parseJSON(xhr.responseText);
store.recordWasInvalid(record, data.errors);
}
Run Code Online (Sandbox Code Playgroud)
所以我可以轻松地做到以下几点:
var transaction = App.store.transaction();
var record = transaction.createRecord(App.Post);
record.set('someProperty', 'invalid value');
transaction.commit()
// This makes the validation fail
record.set('someProperty', 'a valid value');
transaction.commit();
// This doesn't trigger the commit again.
Run Code Online (Sandbox Code Playgroud)
问题是:如您所见,交易不会尝试重新发布.这里和这里解释了这一点.
所以问题是:如果我不能重用提交,我该如何处理?我有点怀疑与我将异常地将模型放到invalid状态这一事实有关- 通过阅读文档,它似乎是用于客户端验证的东西.在这种情况下,我该如何使用它们?
我正在使用ember(+ data)并构建了一个简单的注册表单,但是在服务器端验证错误之后我无法使表单(和ember-data事务)正常工作.
我正在关注https://github.com/dgeb/ember_data_example作为如何使用事务的指南,它主要适用于Happy Path,但是在服务器端验证错误之后,我无法获得ember-data单击"提交"时重新提交API请求.
我做了一些挖掘,我认为我错过了一些与模型失效后重置事务有关的步骤......
您可以在http://emb.herokuapp.com/上试用该应用并重现该问题
您还可以访问https://github.com/justinfaulkner/ember-data-resubmit查看完整的源代码.
您可以使用@ example.com上的电子邮件地址在我的应用程序中填写表单,从而触发虚假的服务器端错误.Rails API将响应422并将错误对象键入用户名/电子邮件字段.
该字段应以红色突出显示错误 - 将电子邮件地址编辑为应该有效的内容,然后再次单击"提交".在chrome中打开开发人员工具时,我看不到ember-data通过点击发送http请求(但控制器中的console.log表示确实正在接收点击).
在使用错误修改字段后,ember-data(我认为)会将模型更改invalid为uncommitted以便在下次commit调用时提交它.当我单击Submit时,ember-data应该将HTTP请求发送到我的api,而ember应该转换为"Congrats!".页.
然而,相反,形式就在那里.没有http请求.没有过渡到"恭喜!".
这是我更新输入后点击提交几(18)次后的屏幕截图:

以下是我的余烬应用程序的一些片段:
我的路线使用startEditing类似于ember_data_example的做法:
App.IndexRoute = Ember.Route.extend({
model: function() {
return null;
},
setupController: function(controller) {
controller.startEditing();
},
deactivate: function() {
this.controllerFor('index').stopEditing();
}
});
Run Code Online (Sandbox Code Playgroud)
我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(); …Run Code Online (Sandbox Code Playgroud)