1

怎么可能在 Sproutcore 中留下一个状态?实际上,我正在寻找相当于:

MyApp.statechart.gotoState('StateA');

是否有另一种方法可以手动离开状态而不是通过substatesAreConcurrent: NO属性控制它?例如:StateA 和 StateB 是并发的。StateB 有两个嵌套的子状态:StateBa 和 StateBb。当我从 StateBa 切换到 StateBb 时,我想离开 StateA。这怎么可能?

先感谢您!

4

1 回答 1

3

给定一个状态图:

App.statechart = SC.Statechart.create({

   substatesAreConcurrent: YES,

   stateA: SC.State.extend({
   }),

   stateB: SC.State.extend({

      initialSubstate: 'stateBa'

      stateBa: SC.State.extend({
      }),

      stateBb: SC.State.extend({
      })

   })

});

您的应用程序同时在 stateA 和 stateB 内。为了在从 stateBa->stateBb 转换时从 stateA 转换到其他状态,我们必须如下增强 stateA:

   stateA: SC.State.extend({

      initialSubstate: 'stateAa',

      stateAa: SC.State.extend({
      }),

      stateAb: SC.State.extend({
      })

   }),

实现这一点的惯用方法是在两种状态下处理相同的事件,比如“更改”,如下所示:

App.statechart = SC.Statechart.create({

   substatesAreConcurrent: YES,

   stateA: SC.State.extend({

      initialSubstate: 'stateAa',

      stateAa: SC.State.extend({

         change: function() {
            this.gotoState('stateAb');
         }

      }),

      stateAb: SC.State.extend({
      })

   }),

   stateB: SC.State.extend({

      initialSubstate: 'stateBa'

      stateBa: SC.State.extend({

         change: function() {
            this.gotoState('stateBb');
         }

      }),

      stateBb: SC.State.extend({
      })

   })

});

这样,发送“更改”事件会导致两个并发状态的状态转换。但是,如果您有兴趣离开并发,您可以像这样增强您的状态图:

App.statechart = SC.Statechart.create({

   stateSuperA: SC.State.extend({
      substatesAreConcurrent: YES,

      stateA: SC.State.extend({

         initialSubstate: 'stateAa',

         stateAa: SC.State.extend({

            change: function() {
               this.gotoState('stateAb');
            }

         }),

         stateAb: SC.State.extend({

            join: function() {
               this.gotoState('stateSuperB');
            }

         })

      }),

      stateB: SC.State.extend({

         initialSubstate: 'stateBa'

         stateBa: SC.State.extend({

            change: function() {
               this.gotoState('stateBb');
            }

         }),

         stateBb: SC.State.extend({
         })

      })

   }),

   stateSuperB: SC.State.extend({
   })

});

在收到上面的“加入”事件后,您的应用程序将不再处于并发子状态,而只是处于 stateSuperB。

于 2012-08-15T15:24:44.877 回答