在多个文件之间拆分Ember状态图时发生转换错误

时间:2012-09-07 19:20:34

标签: ember.js statechart

我正在努力弄清楚如何最好地将我的Ember.js状态图分成多个文件。

使用SproutCore我们需要使用SC.State.plugin('statename')将我们在另一个文件中定义的状态与我们的主状态图相关联。

我在Ember中没有看到这样的功能,所以我只是在状态管理器的状态哈希中添加了一个新状态。 (另见我的jsFiddle

App.statemanager = Ember.StateManager.create({
   stateOne: Ember.State.create(....)
})

// new file:
App.statemanager.states.stateTwo = Ember.State.create(....)

起初这似乎有效 - 我能够转换到我定义的新状态。但是,我发现我无法使用操作转换 out 此状态:

App.statemanager.states.stateTwo = Ember.State.create({
   doSomething: (manager) {
      manager.transitionTo("stateOne");
   }
)}

App.statemanager.send("doSomething");   // throws error when trying to transition

我在本地获得的错误是

Uncaught Error: assertion failed: You need to provide an object and key to `get`. 
  Ember.StateManager.Ember.State.extend.findStatesByRoute

我在jsFiddle中收到的错误是

Uncaught TypeError: Cannot read property 'length' of undefined
  Ember.StateManager.Ember.State.extend.contextFreeTransition
  Ember.StateManager.Ember.State.extend.transitionTo

有谁知道为什么会这样,以及打破状态图的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

而不是尝试编辑或添加到已创建的状态管理器,您应该构建各个状态,然后在构建状态图时将它们全部组合。

例如:http://jsfiddle.net/a6wHt/5/

App.Statemanager = Ember.StateManager.extend({
    initialState: 'stateOne',

    stateOne: App.StateOne,
    stateTwo: App.StateTwo,
    stateThree: App.StateThree,
    stateFour: App.StateFour
});

另外,我使用extend来构建'class',然后在最后用create实例化。我认为养成这样做的习惯是个好主意,即使你把状态图表视为单身人士也是如此。它使您的代码更容易在以后测试。