16

我已经为此苦苦挣扎了一段时间;让我们看看是否有人可以帮助我。

尽管自述文件中没有明确说明,但 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 调用中添加类似的内容,我可以将模型置于“无效”状态,并带有来自服务器端的错误对象:

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.

问题是:如您所见,事务不会尝试重新提交。这是解释herehere

所以问题是:如果我不能重用提交,我应该如何处理?我有点怀疑这与我异步将模型置于invalid状态这一事实有关 - 通过阅读文档,这似乎是用于客户端验证的东西。在这种情况下,我应该如何使用它们?

4

5 回答 5

4

我有一个待处理的拉取请求,应该可以解决这个问题

https://github.com/emberjs/data/pull/539

于 2013-01-09T18:37:59.773 回答
2

record.set(...)我尝试了 Javier 的回答,但是在对处于无效状态的记录进行任何操作时,我得到“无效路径” 。我发现有效的是:

// with the record in invalid state
record.send('becameValid');
record.set('someProperty', 'a valid value');
App.store.commit();

或者,似乎如果我record.get(...)先打电话,那么随后的record.set(...)电话就会起作用。这可能是一个错误。但是上述解决方法通常可以在不更改任何属性的情况下重新提交相同的记录。(当然,如果属性仍然无效,它将再次失败。)

于 2012-12-04T17:56:19.857 回答
1

这似乎是一个过于简单的答案,但为什么不创建一个新事务并将预先存在的记录添加到其中呢?我也在试图找出一种错误处理方法。

此外,为了重用,您可能应该考虑在商店级别而不是适配器级别编写它。

于 2012-06-22T23:51:49.623 回答
1

由于某些未知原因,该记录成为商店默认交易的一部分。这段代码对我有用:

var transaction = App.store.transaction();
var record = transaction.createRecord(App.Post);
record.set('someProperty', 'invalid value');
transaction.commit()

record.set('someProperty', 'a valid value');
App.store.commit(); // The record is created in backend

问题是,在第一次失败后,您必须始终使用App.store.commit()它遇到的问题。

于 2012-10-31T11:05:52.780 回答
0

看看这个要点。它是我在项目中使用的模式。

https://gist.github.com/danielgatis/5550982

于 2013-05-09T22:10:45.173 回答