Ember延迟控制器,直到验证完成

时间:2015-09-26 21:24:36

标签: javascript ember.js

我有一种情况需要在会话中获得一些属性,但我还没有找到一个成功的解决方案来在成功登录后延迟加载路由。

所以这就是交易 - 当用户登录时,他们会被发送到电话号码路由。应用程序控制器上的this.get(' session.currentUser')尚未设置。

当我走另一条路然后回来时,它设置正确。如果我在登录后通过电话号码路由然后刷新页面,则由于初始化程序中的deferReadiness和advanceReadiness,电话号码正确加载。我无法在登录前推迟阅读,因为该应用已经加载并准备就绪。

唯一缺少的部分是,在用户登录后,它应该加载<div class="airport-selections"> <label class="airport-label" for="airport-from"> Departure: </label> <input type="text" class="airport-input"> </div> 中的数字,这是下面粘贴的最后一段代码。但是,由于routes/phone-numbers.js尚未设置,因此未加载myStoreId

我已经尝试了很多东西来完成这项工作,并且正在寻找关于最后一部分的一些想法。它离工作太近了,但只丢了一小块。

session.currentUser

2 个答案:

答案 0 :(得分:1)

尝试使用Promise:

// controllers/application.js
export default Ember.Controller.extend({
  myStore: Ember.computed('session.currentUser', function(){
    // return the store object that is associated with the current user
    return new Ember.RSVP.Promise(resolve => {
      if(this.get('session.isAuthenticated')){
        if(this.get('session.myStore')){
          resolve(this.get('session.myStore'));
        } else {
          console.log(this.get('session.currentUser'));
          // this is where the problem is. The session.currentUser is not populated yet.

          this.get('store').find('store', {user: this.get('session.currentUser.id')}).then(function(data) {
            this.get('session').set('myStore', data.get('firstObject'));
            resolve(this.get('session.myStore'));
          });
        }
      }
    });
  })
});


// routes/phone-numbers.js
export default Ember.Route.extend({
  setupController: function(controller, model){
    this._super(controller, model);
    let myStoreId = this.controllerFor('application').get('myStore').then(myStore => {
      let myStoreId = myStore.get('id');
      if(!myStoreId){
        console.log(this.get('session.currentUser'));
        // there is no currentUser set on the session after login
      } else {
        this.store.find('store-phone-number', {'store': myStoreId}).then(function(numbers){
          controller.set('numbers', numbers);
        });
      }
    });
  }
});

答案 1 :(得分:1)

Daniel建议玩弄承诺让我得到了解决方案。基本上我需要返回一个承诺,如果myStore尚未设置,并且还必须在登录后的第一条路径中考虑到这一点。

export default Ember.Controller.extend({
  myStore: Ember.computed(function(){
    // return the store object that is associated with the current user
    if(this.get('session.isAuthenticated')){
      if(this.get('session.myStore')){
        return this.get('session.myStore');
      }else{
        return new Promise(resolve =>{
          this.get('session').setCurrentUser().then(data => {
            this.get('store').find('store', {user: this.get('session.currentUser.id')}).then(data => {
              this.get('session').set('myStore', data.get('firstObject'));
              resolve(this.get('session.myStore'));
            });
          });
        })
      }
    }
  }),
});

export default Ember.Route.extend({
  setNumbers: function(controller, id){
    this.store.find('store-phone-number', {'store': id}).then(numbers => {
      controller.set('numbers', numbers);
    });
  },
  setupController: function(controller, model){
    this._super(controller, model);

    if(this.controllerFor('application').get('myStore.id')){
      let myStoreId = this.controllerFor('application').get('myStore.id')
      this.setNumbers(controller, myStoreId);
    }else{
      let myStore = this.controllerFor('application').get('myStore').then(data => {
        this.setNumbers(controller, data.id);
      });
    }
  },
});