21

次のシナリオで使用されるワークフローを理解するのに苦労しています。

ユーザーがモデルを作成します。これを製品と呼びましょう。入力フォームを提示します。検証以外の何らかの理由による保存エラー (タイムアウト、アクセス拒否など) Ember では、これによりモデルがエラー状態になります。UI の観点から言えば、私がやりたいことは、画面にメッセージを表示し (簡単)、ユーザーが再試行できるようにすることだけです (明らかに簡単ではありません)。

トランザクションを再利用しないように書かれているのを何度も見てきました。私はその論理を理解しています。新しい製品の場合、単純に別の新しい製品を作成し、元の製品のデータ (属性、関係) をマージして、コントローラーのコンテンツを新しい製品に置き換えます。これは難しいことではなく、うまく機能しているように見えますが、(うまくいけば) もっと良い方法があるかもしれません。

しかし、製品を編集しているときに重大な問題が発生し、上記の解決策が機能しません。製品モデルは現在エラー状態にあり、同じ状態ではないこの製品のコピーを取得する方法が見つかりません。

私が理解できないのは、このモデルがエラー状態になったときに何ができるかということです。私は次のことを試しました:

ロールバック:これは機能しません。エラー状態のトランザクションをロールバックすることはできません。

リロード:上記と同じ。エラー状態のレコードをリロードすることはできません。

レコードの新しいコピーを取得します:そこで、既存のレコードと同じ ID で App.Product.find(id) を試します。エラー状態の既存のレコードのコピーが表示されるだけです。

ここでかなり基本的なものが欠けていることを願っています。エラー状態 (または無効な状態) からレコードを適切にロールアウトすることは可能ですか?

これらのモデルの状態を変更する簡単な方法がある場合、さらにコミットを試みるために新しいトランザクションを作成する必要がありますか?

4

4 に答える 4

14

したがって、ソースを読んで実験して数日後、これはまだ実装されていない機能であるという結論に達しました。レコードを別の状態に移動するには、レコードにイベントを送信して、レコードをに渡すことになっていstatemanagerます。レコードを回復できるエラー状態に登録されたイベントはないようです。

醜い回避策があります-私はレコードのを呼び出しtransitionToて、それを私たちが望む状態にすることができます。statemanager私はこれを軽く行うことに決めませんでしたが、この時点で、残り火データが進化するのを待つ間、プロジェクトを続行する必要があります。したがって、レコードがこれまでに保存されていない場合は、次のように呼び出すことで、無効またはエラー状態からレコードを救済できます。

model.get('stateManager').transitionTo('loaded.created.uncommitted')

または既存のレコードの場合:

model.get('stateManager').transitionTo('loaded.updated')

これが呼び出されると、モデルが存在するトランザクションでcommitの呼び出しを再試行できます。commitが呼び出されると、ember-dataの動作はモデルをデフォルトのトランザクションに移動するため、これがデフォルトのトランザクションになります。それは元のトランザクションです。を呼び出すことにより、モデルの現在のトランザクションをいつでも取得できますmodel.get('transaction')

したがって、これの最後に、Ruby on Railsで見られる典型的なCRUDシナリオを作成する方法がありますが、これが理想的な方法であるとは思いません。ただし、現時点では、残り火データチームもそうではないと思います。

EmberのコントローラーおよびルートミックスインとしてCRUD機能を使用することに関心のある方のために、現在使用しているコードを含むGistがあります。これは正常に機能しており、保存エラーと検証エラーから回復します。うまくいけば、残り火データが進化するにつれて、これを改良し続けることができます。

于 2013-02-12T21:34:29.043 に答える
8

1.0.0-beta5 に DS.Errors を追加すると ( https://github.com/emberjs/data/commit/994f3b234ef899b79138ddece60d8b214c5449e3を参照)、呼び出すことができるはずです...

record.get("errors").clear();

これにより、以前のエラーとトリガーが消去されますbecameValid

于 2014-01-17T18:56:07.833 に答える
2

becameValidその上でイベントをトリガーできます。

record.send("becameValid");

これにより、モデルがコミットされていない状態に移行するはずです。

于 2013-02-10T13:29:44.603 に答える
0

永続化されていないが、永続化されたモデルと同じプロパティを持つEmber.Objectとしてモデルの並列表現を作成してみることができます。ajaxがエラー状態でバウンスする場合は、ajaxメソッドによって提供されるエラーコールバックを使用して何かを行うことができます。

この場合、「何か」とは、レコードを削除してから、ダミーオブジェクトのプロパティを新しいレコードに複製し、レコードを再保存することです。コールバックが成功したら、一時オブジェクトを破棄し、すべてのレコードがクリーンな場合は、一時オブジェクトをクリアします(一時オブジェクトが長引くのを防ぐため)。

これも非常識かもしれません...しかし、それはオプションとして私を襲います。

于 2013-02-08T10:10:12.383 に答える