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(); })
、実行ループの最後に次の状態に移行することもできましたが、代わりに宣言的なアプローチを採用し、出入りするときに各コントローラーのコンテンツを設定/設定解除するだけで済みました。適切な状態。