1

Sproutcore で状態を残すにはどうすればよいですか? 実際、私は次のものに相当するものを探しています:

MyApp.statechart.gotoState('StateA');

substatesAreConcurrent: NOプロパティを介して状態を制御する代わりに、状態を手動で残す別の方法はありますか? 例: StateA と StateB は同時です。StateB には、StateBa と StateBb という 2 つのネストされたサブステートがあります。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 に答える