16

私はしばらくこれに苦労してきました。誰かが私を助けてくれるか見てみましょう。

Readme には明示的に記載されていませんが、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.

問題は、ご覧のとおり、トランザクションは再コミットしようとしないということです。これについては、こちらこちらで説明しています。

つまり、コミットを再利用できない場合、これをどのように処理すればよいでしょうか? モデルを非同期的にinvalid状態にするという事実に関係があるのではないかと思います-ドキュメントを読むと、クライアント側の検証を目的としたもののようです。この場合、どのように使用すればよいですか?

4

5 に答える 5

4

これを修正する保留中のプル リクエストがあります

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

于 2013-01-09T18:37:59.773 に答える
2

ハビエルの答えを試しrecord.set(...)ましたが、無効な状態のレコードで何かを行うと「無効なパス」が表示されます。私がうまくいったのは次のとおりです。

// 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

なんらかの理由で、レコードはストアのデフォルト トランザクションの一部になります。このコードは私のために働きます:

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 に答える
1

これは非常に単純な答えに思えるかもしれませんが、新しいトランザクションを作成して既存のレコードを追加してみませんか? また、エラー処理のアプローチを理解しようとしています。

また、再利用のために、アダプタ レベルではなくストア レベルでこれを記述することを検討する必要があります。

于 2012-06-22T23:51:49.623 に答える