2012-03-23 50 views
2

我使用迄今優秀的'javascript-state-machine'庫。但是,我的事件看起來像A),我有幾個過渡回調看起來像B)。我有一個類似的'onafterevent'回調在其他地方工作。但''afterafterpart'沒有解僱,我不明白爲什麼。javascript-state-machine onafterevent不被稱爲

我是i)致電'my-state-machine.EEpart',它應該在整個轉換過程中觸發回調。和ii)'onbeforeepart'正在被調用。所以我不知道爲什麼這個事件沒有被調用。

之前有人看過類似的東西嗎?提前致謝。

A)

 

    esm : StateMachine.create({ 
           initial: 'Es', 
           events: [ 
           { name: 'EsE', from: 'Es', to: 'E' }, 
           { name: 'EEpart', from: 'E', to: 'Epart' },  
           { name: 'EpartE', from: 'Epart', to: 'E' }, 
           { name: 'EEs', from: 'E', to: 'Es' } 
           ] 

B)

 

    onbeforeEEpart: (event, from, to, args) -> 
    ... 

    onafterEEpart: (event, from, to, args) -> 
    ... 

UPDATE [03月23日; 2:49 am]

我試着從Epart-> E手動轉換,並在A)中得到錯誤。看起來E-> Epart的過渡從未完成。我有一個理由說明爲什麼。

在上一次轉換之後,我必須將下一個轉換附加到點擊函數,如B所示。這樣做包括使用下劃線將我的轉換函數重新綁定到狀態機。我認爲這是導致錯誤。如果是這樣,是否有正確的方法來傳遞過渡函數來解僱?

由於

A)

 

    Uncaught event EpartE inappropriate because previous transition did not complete 

B)

 

    onafterPreviousEvent: (event, from, to, args) -> 
     console.log('END Transition from Es->E') 

     $(my-element) 
     .bind('click', 
       { fu: bar }, 
       _.bind(args.data.esm.EEpart, args.data.esm)) # state machine is 'args.data.esm' 

回答

2

好的,我解決這一個。事實證明,我有一個返回StateMachine.ASYNC標誌的事件函數。回調的工作流程之下,onleaveE是被稱爲並返回一個異步標誌onafterEEpart可稱爲前:

  • onbeforeevent - 離開老態
  • 發射時 - 在事件發生前解僱
  • onleavestate
  • onenterstate - 進入新狀態時
  • onafterevent解僱 - 在事件發生後解僱

通常,當您返回StateMachine.ASTNC標誌時,必須手動在您的stateMachine對象上調用transition()。這很棘手,讓我呆了一天左右。希望將來可以幫助別人。