2012-06-15 16 views
15

私はしばらくこのことに苦労してきました。誰かが私を助けることができるかどうかを見てみましょう。ember-data検証の標準パターンは何ですか? (invalid state、becomeInvalid ...)

明示的に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. 

問題は:ご覧のとおり、取引はお勧めしません。これは、herehereと説明されています。

私はコミットを再利用できない場合、どうすればよいですか?私はちょっと疑問に思うのですが、私はモデルをinvalid州に非同期的に入れています - reading the documentationによって、それはクライアント側のバリデーションのためのものであるようです。この場合、どのように使用すればよいですか?

答えて

1

これは単純すぎる答えかもしれませんが、新しいトランザクションを作成して既存のレコードを追加するのはなぜですか?私はまた、エラー処理手法を理解しようとしています。

また、再使用のためにアダプタレベルではなくストアレベルでこれを記述することをお勧めします。

+1

は、これが問題になることはないでしょうか? –

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()を使用しなければならないということです。

+0

私は間違っているかもしれませんが、具体的にコンテキストを定義しない限り、デフォルトのトランザクションとして関連付けられていると思います。 – Marco

+0

その例はありますか? –

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(...)のコールを呼び出す場合は動作しているようです。おそらくバグです。しかし、上記の回避策は、プロパティを変更しなくても同じレコードを再コミットできるということで一般的に機能します。 (プロパティはまだそれだけで再び失敗する無効な場合、もちろん。)

+0

私のモデル 'becomeInvalid'関数で' record.send( 'becomeValid');を追加しました。これは私の問題を回避しました。これはCyrilからのGitHubプルリクエストに関するコメントからインスピレーションを受けています。 – ybart

0

を修正する必要が保留中のプルリクエストを持っています。私のプロジェクトで使っているパターン。あなたが取引に汚れたオブジェクトを追加することはできませんので、

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

関連する問題