ember数据验证的标准模式是什么?(invalid state、becameInvalid...)

oipij1gg  于 2023-01-13  发布在  其他
关注(0)|答案(6)|浏览(167)

我为此挣扎了一段时间看看有没有人能帮我。
尽管在自述文件中没有明确说明,但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状态有关-通过阅读文档,它似乎是为客户端验证准备的。在这种情况下,我应该如何使用它们呢?

yv5phkfx

yv5phkfx1#

我有一个挂起的拉入请求,可以修复此问题
https://github.com/emberjs/data/pull/539

hgqdbh6s

hgqdbh6s2#

我尝试了Javier的答案,但是当记录处于无效状态时,执行任何record.set(...)操作时,我得到“Invalid Path”。

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

或者,如果我先调用record.get(...),那么后续的record.set(...)调用就会起作用。这可能是一个bug。但是,上面的解决方案通常可以工作,即使不更改任何属性,也能够重新提交相同的记录。(当然,如果属性仍然无效,它将再次失败。)

juzqafwq

juzqafwq3#

这似乎是一个过于简单的答案,但是为什么不创建一个新事务并将预先存在的记录添加到其中呢?我还在尝试找出一种错误处理方法。
此外,为了重用,您可能应该考虑在存储层而不是适配器层编写此代码。

d5vmydt9

d5vmydt94#

由于某些未知的原因,记录成为商店默认事务的一部分。下面的代码对我很有效:

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()与它所具有的问题。

f8rj6qna

f8rj6qna5#

给予这个要点。这是我在我的项目中使用的模式。
https://gist.github.com/danielgatis/5550982

qq24tv8q

qq24tv8q6#

@约瑟夫·豪梅
看一下https://github.com/esbanarango/ember-model-validator
示例:

import Model, { attr } from '@ember-data/model';
import { modelValidator } from 'ember-model-validator';

@modelValidator
export default class MyModel extends Model {
  @attr('string') fullName;
  @attr('string') fruit;
  @attr('string') favoriteColor;

  validations = {
    fullName: {
      presence: true
    },
    fruit: {
      presence: true
    },
    favoriteColor: {
      color: true
    }
  };
}

相关问题