ステートチャートを考えると:
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 になります。