2

如果我有通往应用程序深处某个状态的路由,我如何确保已完成正确的控制器设置,尽管我将直接进入内部状态?

例如,

  • 状态 A
    • 状态 a,表示路由:'a'
    • 状态 B
      • 状态 b,表示路由:'a/b'
      • 状态 C
        • 状态 c,表示路由:'a/b/c'
        • 状态 D
          • 状态 d,表示路由:'a/b/c/d
          • 状态 E

如您所见,您可以直接路由到状态“a”、“b”、“c”或“d”,但您看不到的是,通常您可以通过在控制器中选择一个项目来在这些状态之间切换,然后将触发状态转换到更深的状态。那么问题是,当您直接进入“d”状态时,没有设置任何控制器的选择

到目前为止,我已经enterStateByRoute在状态'a'中使用来设置第一个控制器的选择,然后不得不enterStateByRoute在状态'b'中使用来选择第一个和第二个控制器等,一直到enterStateByRoute状态'd ' 一路做每个控制器的选择。这非常浪费,因为我最终在每个enterStateByRoute.

设置控制器选择以匹配直接路由状态的最佳方法是什么?

4

1 回答 1

1

一旦我意识到enterStateByRoute路由时会在链中的所有父状态上调用它,我就能够大大改善这种情况。这意味着如果状态'c'与路由匹配,将进入状态'A',然后是状态'B'和状态'C',最后进入状态'c'。我之前没有意识到的是,这些状态中的每一个都会在SC.StateRouteHandlerContext输入对象时传递给对象,从而允许您检查上下文enterStateenterStateByRoute在任何状态中实现。

然后我的解决方案是添加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所以我本可以通过返回一个对象来等待绑定刷新,enterStateByRoutethis.invokeLast(function () { this.resumeGotoState(); })在运行循环结束时进入下一个状态,但是我采用了一种声明性方法,并在进入/退出时简单地设置/取消设置每个控制器的内容适当的状态。

于 2013-05-23T14:30:49.247 回答