2014-11-04 112 views
1

解決,但在尋找改善,看到答案不等待meteor.user鐵路由器()返回

function completedProfile() { 
     if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name && Meteor.user().university_id) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    Router.map(function() { 
     this.route('landing', { 
      path: '/', // match the root path 
      onBeforeAction: function() { 
       this.subscribe('users').wait(); 
       if (this.ready() && completedProfile()) { 
        this.render('bulletin') 
       } else { 
        this.redirect('splash'); 
       } 
      } 
     }); 
    }); 

該頁面將重定向到我飛濺的模板,因爲completeProfile功能是假的(所有領域在if語句中爲null)。

嘗試2(對飛濺掛起領域已填充後):

Router.map(function() { 
     this.route('landing', { 
      path: '/', // match the root path 
      action: function() { 
       if (this.ready() && completedProfile()) { 
        this.redirect('bulletin') 
       } else { 
        this.render('splash'); 
       } 
      }, 
     }); 

嘗試3:

function completedProfile() { 
     if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name && Meteor.user().profile.university_id) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    Router.map(function() { 
       this.route('landing', { 
        path: '/', // match the root path 
        action: function() { 
         console.log(Meteor.user().profile); //this fails 
         console.log(this.ready(), completedProfile()); //this then returns as expected 
         if (this.ready() && !completedProfile()) { 
          this.redirect('splash'); 
         } else { 
          this.render('bulletin') 
         } 
        }, 
       }); 

       this.route('splash', { 
        path: '/splash', // match the root path 
       }); 

       this.route('bulletin', { 
        path: '/bulletin', // match the root path 
       }); 

這很古怪,這工作。 Meteor.user的日誌會導致錯誤,然後然後 Meteor.user()會給我一個合適的completedProfile()返回值。錯誤是Exception in callback of async function: TypeError: Cannot read property 'profile' of undefined

+0

'的console.log(Meteor.user()配置文件);'拋出一個錯誤,當'Meteor.user()''返回undefined'(你想閱讀'undefined'屬性''profile'')。嘗試'if(Meteor.user()){console.log(Meteor.user()。profile)}' – 2014-11-05 02:58:21

回答

2

看起來您正在重定向到名爲splash的路線。你沒有包括它,但我會認爲它存在。一旦你重定向,你用的landing路線的任何邏輯進行的,因此completedProfile()不會再運行一次一個用戶登錄

試試這個:留在landing路線上,但render()直到用戶登錄的啓動頁面。

if (this.ready() && completedProfile()) { 
    this.render('bulletin') 
} else { 
    this.render('splash'); 
} 

我不認爲this.subscribe('users').wait();有幫助。我會刪除它。我想你也想用action而不是onBeforeAction,因爲你自己打電話給render()

另請參閱:https://github.com/EventedMind/iron-router/issues/91。聽起來像instant login會適合您的使用情況。

+0

如果我做了'if(ready && complete)redirect(bulletin)else render(splash)',它仍然會掛起啓動頁面(這一切都在採取行動)。我現在就來看看即時登錄。 – Vish 2014-11-04 16:34:12

+0

我會嘗試這一點,到目前爲止停止工作 – Vish 2014-11-04 23:58:13

+0

你確定'stop()'是什麼使它的工作?我認爲將'redirect()'改爲'render()'是讓它工作的原因,因爲你停留在'landing'路線上,它會作出反應(重新渲染)。 – 2014-11-05 00:02:50

1

當前工作的解決方案:

function completedProfile() { 
     if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name && Meteor.user().profile.university_id) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    Router.map(function() { 
     this.route('landing', { 
      path: '/', // match the root path 
      action: function() { 
       if (this.ready()) { 
        if (!completedProfile()) { 
         this.render('splash'); 
         this.stop(); 
        } else { 
         this.render('bulletin') 
        } 
       }  
      } 
     } 
    }); 
+0

當他們填寫配置文件時,completedProfile將切換爲true,呈現公告。停止使得它可以在完成時保存所有的答案,並在做可選的事情時讓它不重定向。 – Vish 2014-11-05 03:04:00

+0

這就是我所推薦的。你會接受我的回答嗎?或者你想讓我改進它?另外:如果你要創建一個[gist](https://gist.github.com/)或者repo(在github,gitlab等),那麼在代碼上進行協作會更容易。 – 2014-11-05 16:37:40