我为此挣扎了一段时间看看有没有人能帮我。
尽管在自述文件中没有明确说明,但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对象将模型置于"invalid"状态:
error: function(xhr){
var data = Ember.$.parseJSON(xhr.responseText);
store.recordWasInvalid(record, data.errors);
}
所以我可以很容易地进行如下说明:
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.
问题是:如您所见,事务不会尝试重新提交。这在这里和这里进行了解释。
所以问题是:如果我不能重用一个提交,我应该如何处理呢?我有点怀疑这与我异步地将模型置为invalid
状态有关-通过阅读文档,它似乎是为客户端验证准备的。在这种情况下,我应该如何使用它们呢?
6条答案
按热度按时间yv5phkfx1#
我有一个挂起的拉入请求,可以修复此问题
https://github.com/emberjs/data/pull/539
hgqdbh6s2#
我尝试了Javier的答案,但是当记录处于无效状态时,执行任何
record.set(...)
操作时,我得到“Invalid Path”。或者,如果我先调用
record.get(...)
,那么后续的record.set(...)
调用就会起作用。这可能是一个bug。但是,上面的解决方案通常可以工作,即使不更改任何属性,也能够重新提交相同的记录。(当然,如果属性仍然无效,它将再次失败。)juzqafwq3#
这似乎是一个过于简单的答案,但是为什么不创建一个新事务并将预先存在的记录添加到其中呢?我还在尝试找出一种错误处理方法。
此外,为了重用,您可能应该考虑在存储层而不是适配器层编写此代码。
d5vmydt94#
由于某些未知的原因,记录成为商店默认事务的一部分。下面的代码对我很有效:
问题是,在第一次失败后,您必须始终使用
App.store.commit()
与它所具有的问题。f8rj6qna5#
给予这个要点。这是我在我的项目中使用的模式。
https://gist.github.com/danielgatis/5550982
qq24tv8q6#
@约瑟夫·豪梅
看一下https://github.com/esbanarango/ember-model-validator。
示例: