為了跟蹤或執(zhí)行當(dāng)轉(zhuǎn)換動(dòng)作發(fā)生時(shí)的行為,有以下五個(gè)通用生命周期事件可以觀測(cè):
-
onBeforeTransition- 執(zhí)行任意轉(zhuǎn)換動(dòng)作前被觸發(fā) -
onLeaveState- 離開(kāi)任意狀態(tài)時(shí)被觸發(fā) -
onTransition- 執(zhí)行任意轉(zhuǎn)換動(dòng)作期間被觸發(fā) -
onEnterState- 剛進(jìn)入任意狀態(tài)時(shí)被觸發(fā) -
onAfterTransition- 執(zhí)行任意轉(zhuǎn)換動(dòng)作后被觸發(fā)
除了通用事件之外,還可以使用特定的轉(zhuǎn)換動(dòng)作和狀態(tài)名稱(chēng)來(lái)觀察:
-
onBefore<TRANSITION>- 執(zhí)行指定轉(zhuǎn)換動(dòng)作前被觸發(fā) -
onLeave<STATE>- 離開(kāi)指定狀態(tài)時(shí)被觸發(fā) -
onEnter<STATE>- 剛進(jìn)入指定狀態(tài)時(shí)被觸發(fā) -
onAfter<TRANSITION>- 執(zhí)行指定轉(zhuǎn)換動(dòng)作后被觸發(fā)
為了方便起見(jiàn),兩個(gè)最有用的事件可以進(jìn)行縮寫(xiě):
-
on<TRANSITION>-onAfter<TRANSITION>的簡(jiǎn)寫(xiě) -
on<STATE>-onEnter<STATE>的簡(jiǎn)寫(xiě)
觀測(cè)生命周期
使用觀察者方法觀察單個(gè)生命周期事件:
fsm.observe('onStep', function() {
console.log('stepped');
});
使用觀察者方法觀察多個(gè)生命周期事件:
fsm.observe({
onStep: function() { console.log('stepped'); }
onA: function() { console.log('entered state A'); }
onB: function() { console.log('entered state B'); }
});
狀態(tài)機(jī)觀察自己的生命周期:
var fsm = new StateMachine({
init: 'A',
transitions: [
{ name: 'step', from: 'A', to: 'B' }
],
methods: {
onStep: function() { console.log('stepped'); }
onA: function() { console.log('entered state A'); }
onB: function() { console.log('entered state B'); }
}
});
生命周期事件的參數(shù)
具有以下屬性的lifecycle對(duì)象將作為參數(shù)傳遞給觀察者:
- transition - 轉(zhuǎn)換動(dòng)作的名稱(chēng)
- from - 上一個(gè)狀態(tài)
- to - 下一個(gè)狀態(tài)
除了lifecycle參數(shù),觀察者還接收任意個(gè)傳遞給轉(zhuǎn)換方法的參數(shù)。
var fsm = new StateMachine({
transitions: [
{ name: 'step', from: 'A', to: 'B' }
],
methods: {
onTransition: function(lifecycle, arg1, arg2) {
console.log(lifecycle.transition); // 'step'
console.log(lifecycle.from); // 'A'
console.log(lifecycle.to); // 'B'
console.log(arg1); // 42
console.log(arg2); // 'hello'
}
}
});
fsm.step(42, 'hello');
生命周期事件名
生命周期事件名總是使用標(biāo)準(zhǔn)的js駝峰命名法。 即便你的轉(zhuǎn)換方法和狀態(tài)沒(méi)有這樣命名:
var fsm = new StateMachine({
transitions: [
{ name: 'do-with-dash', from: 'has-dash', to: 'has_underscore' },
{ name: 'do_with_underscore', from: 'has_underscore', to: 'alreadyCamelized' },
{ name: 'doAlreadyCamelized', from: 'alreadyCamelize', to: 'has-dash' }
],
methods: {
onBeforeDoWithDash: function() { /* ... */ },
onBeforeDoWithUnderscore: function() { /* ... */ },
onBeforeDoAlreadyCamelized: function() { /* ... */ },
onLeaveHasDash: function() { /* ... */ },
onLeaveHasUnderscore: function() { /* ... */ },
onLeaveAlreadyCamelized: function() { /* ... */ },
onEnterHasDash: function() { /* ... */ },
onEnterHasUnderscore: function() { /* ... */ },
onEnterAlreadyCamelized: function() { /* ... */ },
onAfterDoWithDash: function() { /* ... */ },
onAfterDoWithUnderscore: function() { /* ... */ },
onAfterDoAlreadyCamelized: function() { /* ... */ }
}
});
生命周期事件執(zhí)行順序列表
綜上所述,轉(zhuǎn)換的生命周期按以下順序執(zhí)行:
-
onBeforeTransition- 執(zhí)行任意轉(zhuǎn)換動(dòng)作前被觸發(fā) -
onBefore<TRANSITION>- 執(zhí)行指定轉(zhuǎn)換動(dòng)作前被觸發(fā) -
onLeaveState- 離開(kāi)任意狀態(tài)時(shí)被觸發(fā) -
onLeave<STATE>- 離開(kāi)指定狀態(tài)時(shí)被觸發(fā) -
onTransition- 執(zhí)行任意轉(zhuǎn)換動(dòng)作期間被觸發(fā) -
onEnterState- 剛進(jìn)入任意狀態(tài)時(shí)被觸發(fā) -
onEnter<STATE>- 剛進(jìn)入指定狀態(tài)時(shí)被觸發(fā) -
on<STATE>-onEnter<STATE>的簡(jiǎn)寫(xiě) -
onAfterTransition- 執(zhí)行任意轉(zhuǎn)換動(dòng)作后被觸發(fā) -
onAfter<TRANSITION>- 執(zhí)行指定轉(zhuǎn)換動(dòng)作后被觸發(fā) -
on<TRANSITION>-onAfter<TRANSITION>的簡(jiǎn)寫(xiě)
取消轉(zhuǎn)換動(dòng)作
在下列任意生命周期事件中,觀察者都可以通過(guò)顯式的返回false來(lái)取消轉(zhuǎn)換動(dòng)作
onBeforeTransitiononBefore<TRANSITION>onLeaveStateonLeave<STATE>onTransition
所有后續(xù)生命周期事件都將被取消,狀態(tài)將保持不變。