3

私は現在テスト中Ember.Routerで、特定の基準に一致するときに特定のルートへのアクセスをどのように制限できるか疑問に思っています。私の例では、ユーザーが請求方法に進む前に請求先住所を設定する必要があるチェックアウトプロセスで遊んでいます(たとえば、請求方法ビューは、許可された支払い方法を提供するために請求国を知る必要があります)。

私の試みでは、モデルを検証しようとしています (serialize : function () または enter : function () ?)、指定された値が設定されていない場合、ルーターは以前の状態にリダイレクトする必要があります (これを行う必要がありましたそうしないと、ハッシュが正しく更新されません)。

これが私のコード例のフィドルです

http://jsfiddle.net/mediastuttgart/uMKGt/

編集:

トム・デールの言葉を見つけましたが、この質問とは関係ありませんが、それでも良い答えです:「州の全体的なポイントは、このような状況を回避することです...それらを処理するのは現在の州の責任です。」.

参照。http://github.com/emberjs/ember.js/issues/745

これは理にかなっています。

EDIT2:

これは、場所の方法が「null」に設定されている間は理にかなっていますが。'hash' または 'history' を使用して場所の状態を処理し、ユーザーが /index よりも深いルートでページをリロードする場合、現在のルートは値を検証し、特定の基準が一致しない場合は最終的に前のルートにリダイレクトする必要があります (実際、検証は前のルートに属します)。

簡単に言うと、現在のルート検証は前の検証に依存し、すべての条件が満たされたときに状態にリダイレクトする必要があります。

逆順:

  • 配送方法は?(/#/配達/メソッド) いいえ ->
  • 請求方法は?(/#/billing/method) いいえ ->
  • 配送先は?(/#/配達/住所) いや ->
  • 請求先住所 - (/#/billing/address) ここから始めてください。

EmberJS 関係者が問題を解決するのを楽しみにしています :)

4

1 に答える 1

2

私は同じに取り組んできました。私はあなたが正しい方向に進んでいると思います。状態の全体的なポイントについてのトムからのその引用は、本当にその核心に達しています。ルーターは急速に変化しているため、ここに確立されたパターンがあるかどうかはわかりませんが、これまでに学んだことを共有できます.

一般的な問題を要約すると、Ember ルーターは URL を使用してアプリの状態をシリアライズ/デシリアライズします。要求されたルートを知る以外は、ステートレスです。エンド ユーザーはこの状態を完全に制御でき、URL を入力することで、どの状態でもアプリをリロードできます。したがって、すべてのアプリには、要求された状態が与えられたユーザー権限とモデルの現在の状態で「有効」であることをいつ/どのように確認するかという共通の問題があります。

Rails 出身の私の最初の本能は、フィルター前のようにルートを保護することです。これは Ember では注意が必要です。データの読み込みは非同期であるため、ルート階層への最初の降下時には利用できません。このアプローチは自分では機能していませんが、他の人は機能しています。典型的なアプローチのようです

  • 同時状態を許可するsproutcoreステートチャートを使用します(SinisterMinister)
  • 状態遷移の途中で一時停止し、データがロードされるのを待ちます (lukemelia による提案)
  • 以前のバージョンの Ember ルーターでは、mark transition as async を使用できましたが、それは削除されました

トムが状態について言ったことを考えると、私は可能な限りこの状況を回避しようとしています. ルートを「保護」しようとする代わりに、ルートと状態を組み合わせて使用​​し、ユーザーが最初から無効な状態に到達できないようにします。あなたの例では、次のように変更します。

  • 「/billing」での単一の「ルーティング可能な」状態
  • 「メソッド」と「アドレス」という名前の 2 つの「サブステート」 (これらは Ember.Router ではなく Ember.State を拡張し、ルートを設定しない必要があります)
  • 「/billing」ルートの initialState は「address」になります。
  • router.send('billingAddressUpdated') BillingAddressModel が変更されたとき (ユーザー アクションまたは非同期データ ロードのいずれかによる)
  • billingAddressUpdated イベントは、必要に応じて「メソッド」サブステートと「アドレス」サブステートの間を遷移します

ところで、ルートのないサブステートは最近のコミットまで壊れていたため、このアプローチには HEAD ember を使用する必要があります。

他の人がこの問題にどのようにアプローチしているかを知りたいです。お役に立てれば。

于 2012-06-27T16:34:46.723 に答える