2013-05-22 5 views
2

Если у меня есть маршрут до состояния, находящегося в глубине приложения, как я могу обеспечить правильность настройки контроллера, хотя я собираюсь войти в внутреннее состояние напрямую?Как вы настраиваете выбор контроллера при маршрутизации непосредственно в дочернее состояние в SproutCore?

Например,

  • состояние А
    • состояние а, representRoute: 'а'
    • состояние В
      • состояние б, representRoute: 'A/B'
      • состояние C
        • состояние c, представляютRoute: 'a/b/c'
        • состояние D
          • состояние д, representRoute: «A/B/C/D
          • состояние Е

Как вы можете увидеть, вы можете маршрут непосредственно к состояниям 'a', 'b', 'c' или 'd', но то, что вы не видите, состоит в том, что обычно вы переходите между этими состояниями, выбирая элемент в con который затем инициирует переход состояния в более глубокое состояние. Проблема тогда в том, что , когда вы переходите напрямую к состоянию 'd', ни один из ваших настроек контроллеров не установлен.

До сих пор я использовал enterStateByRoute в состоянии «а», чтобы установить выбор первого контроллера, а затем должен был использовать enterStateByRoute в состоянии «B», чтобы сделать выбор первого и второго контроллеров и т.д. все путь к enterStateByRoute в состоянии 'd', чтобы сделать выбор каждого контроллера полностью. Это довольно расточительно, потому что я в конечном итоге повторяю один и тот же код в каждом enterStateByRoute.

Каков наилучший способ установить выбор контроллера в соответствии с прямым маршрутизируемым состоянием?

ответ

1

Мне удалось улучшить ситуацию очень сильно, как только я понял, чтовызывается во всех родительских состояниях цепи при маршрутизации. Это означает, что если состояние «c» соответствует маршруту, будет введено состояние «A», за которым следуют состояние «B» и состояние «C», прежде чем окончательно ввести состояние «c» последним. То, что я раньше не понимал, состоял в том, что каждому из этих состояний передается объект SC.StateRouteHandlerContext по мере его ввода, позволяющий либо проверить контекст в enterState, либо реализовать enterStateByRoute в любом из состояний.

Мое решение затем было добавить enterStateByRoute в состояние «А», чтобы установить первый контроллер, добавьте 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(); }) для перехода к следующему состоянию на конец цикла выполнения, но вместо этого я взял декларативный подход и просто установить/снять каждый содержимое контроллера, когда я вхожу/выхожу из соответствующего состояния.