什么是余烬数据验证的标准模式? (无效状态,成为无效......)

时间:2012-06-15 16:38:19

标签: ember.js ember-data

我有一段时间以来一直苦苦挣扎;让我们看看是否有人可以帮助我。

虽然在自述文件中没有明确说明,但是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状态 - reading the documentation这一事实有关,似乎是用于客户端验证的东西。在这种情况下,我该如何使用它们?

5 个答案:

答案 0 :(得分:4)

我有一个待解决的拉取请求,应该修复此

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

答案 1 :(得分:2)

我尝试了Javier的答案,但在执行任何record.set(...)并且记录处于无效状态时,我得到“无效路径”。我发现的工作是:

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

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

答案 2 :(得分:1)

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

你也应该考虑在商店层面而不是适配器层面写这个,以便重复使用。

答案 3 :(得分: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()来解决问题。

答案 4 :(得分:0)

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

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