2012-03-23 54 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()。这很棘手,让我呆了一天左右。希望将来可以帮助别人。