一旦我意识到enterStateByRoute
路由时会在链中的所有父状态上调用它,我就能够大大改善这种情况。这意味着如果状态'c'与路由匹配,将进入状态'A',然后是状态'B'和状态'C',最后进入状态'c'。我之前没有意识到的是,这些状态中的每一个都会在SC.StateRouteHandlerContext
输入对象时传递给对象,从而允许您检查上下文enterState
或enterStateByRoute
在任何状态中实现。
然后我的解决方案是添加enterStateByRoute
到状态“A”以设置第一个控制器,添加enterStateByRoute
到状态“B”以设置第二个控制器等。例如,通过这种方式,任何超过状态“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(); })
在运行循环结束时进入下一个状态,但是我采用了一种声明性方法,并在进入/退出时简单地设置/取消设置每个控制器的内容适当的状态。