2

アプリケーションの奥深くにある状態へのルートがある場合、内部状態に直接入るつもりですが、適切なコントローラーのセットアップが行われたことを確認するにはどうすればよいですか?

例えば、

  • 州A
    • 状態 a、representRoute: 'a'
    • 状態B
      • 状態 b、representRoute: 'a/b'
      • 状態C
        • 状態 c、representRoute: 'a/b/c'
        • 述べました
          • 状態 d、representRoute: 'a/b/c/d
          • 状態 E

ご覧のとおり、'a'、'b'、'c'、または 'd' の状態に直接ルーティングできますが、通常はコントローラーでアイテムを選択することでこれらの状態の間を移動することがわかりません。これにより、より深い状態への状態遷移がトリガーされます。問題は、状態「d」に直接移動すると、コントローラーの選択が設定されていないことです。

これまでのところ、状態「a」enterStateByRouteを使用して最初のコントローラーの選択を設定し、状態「b」を使用して最初と2番目のコントローラーの選択を行う必要がありました。状態「d」enterStateByRouteまでずっとenterStateByRoute' 各コントローラーの選択を最後まで行います。それぞれで同じコードを繰り返すことになるため、これは非常に無駄enterStateByRouteです。

直接ルーティングされた状態に一致するようにコントローラーの選択を設定する最良の方法は何ですか?

4

1 に答える 1

1

enterStateByRouteルーティング時にチェーン内のすべての親状態で呼び出されることに気付いた後、状況を大幅に改善することができました。これは、状態 'c' がルートと一致する場合、状態 'A' に入り、状態 'B' と状態 'C' が続き、最後に状態 'c' に入るということです。私が以前に気づいていなかったのは、これらの状態のそれぞれがSC.StateRouteHandlerContextオブジェクトに入ったときにオブジェクトに渡され、コンテキストをチェックしenterStateたり、状態のいずれかで実装enterStateByRouteしたりできるということでした。

私の解決策は、enterStateByRoute状態「A」に追加して最初のコントローラーを設定し、enterStateByRoute状態「B」に追加して2番目のコントローラーを設定するなどでした。たとえば、この方法では、状態「A」を過ぎた状態はすべて、最初のコントローラー選択セットであり、チェーンに重複したコードはありません。

例えば、

// … 
state_A: SC.State.extend({
  initialSubstate: 'state_a',

  enterStateByRoute: function (context) {
    // select object on controller 1 since we are routing
  },

  state_a: SC.State.extend({
    representRoute: 'a',

    enterStateByRoute: function (context) {
      // do setup for state 'a' specific to routing
    }
  }),

  state_B: SC.State.extend({
    initialSubstate: 'state_b',

    enterStateByRoute: function (context) {
      // select object on controller 2 since we are routing
    },

    state_b: SC.State.extend({

      enterStateByRoute: function (context) {
        // do set up for state 'b' specific to routing
      },
// …

私が遭遇した唯一の問題は、すべてのコントローラーを一緒にバインドしたため、選択の変更がすぐには反映されず、最初の状態のコントローラーでオブジェクトを選択し、次の状態に入り、バインドされたコントローラーのコンテンツはまだ更新されていません。

SC.Asyncそのため、オブジェクトをenterStateByRoute返すことでバインドがフラッシュされるのを待ちthis.invokeLast(function () { this.resumeGotoState(); })、実行ループの最後に次の状態に移行することもできましたが、代わりに宣言的なアプローチを採用し、出入りするときに各コントローラーのコンテンツを設定/設定解除するだけで済みました。適切な状態。

于 2013-05-23T14:30:49.247 に答える