2

我出于自己的需要复制了这个登录示例。它运行良好。但我在问自己:为什么我需要这Ember.run.later(this, this._serverLogin, 100);条线?就像评论说的那样,它只是为了模拟延迟。行。但是,如果我将其更改为:

// Create the login controller
  MyApp.loginController = Ember.Object.create({
    username: '',
    password: '',
    isError: false,

    tryLogin: function() {
      if(this.get('username') === MyApp.USERNAME &&
         this.get('password') === MyApp.PASSWORD) {
        this.set('isError', false);
        this.set('username', '');
        this.set('password', '');
        MyApp.stateManager.send('loginSuccess');
      } else {
        this.set('isError', true);
        MyApp.stateManager.send('loginFail');
      }
    },
  });   

没有Ember.run.later(this, this._serverLogin, 100);,我得到Uncaught Error: <Ember.StateManager:ember270> could not respond to event loginSuccess in state loggedOut.awaitingCredentials.所以我想可能我需要这个延迟才能让 stateManager 在之前或类似的东西发生变化。但是当我运行旧代码时Ember.run.later(this, this._serverLogin, 0);它仍然有效。那么,有什么不同呢?ember的文档没有给出任何提示。

4

1 回答 1

2

这是因为您在调用( / )StateManager时仍处于早期状态设置过程。sendEventloginSuccessloginFailed

通过延迟发送 w/ 的事件Ember.run.later,您的代码将在下一个运行循环中处理,并正确设置状态。


话虽如此,您正在以非常古老的方式使用 Ember。你应该看看管理应用程序路由的最先进的方法

于 2012-10-30T17:01:39.380 回答