我正在努力將用戶重定向到登錄頁面(如果他沒有登錄)(Windows 7上的Meteor v0.8.0)。使用鐵路路由器重定向未登錄的用戶...再次
在stackoverflow上有幾個類似的問題,但沒有答案似乎適用於我。
都不行#1:渲染()
onBeforeAction: function() {
if (!Meteor.user()) {
// render the login template but keep the url in the browser the same
this.render('login');
// stop the rest of the before hooks and the action function
this.stop();
}
},
兩個問題在這裏:
1的文檔已經過時。沒有this.stop()
功能了。如前所述here,代碼應該是:
onBeforeAction: function (pause) {
if (!Meteor.user()) {
// render the login template but keep the url in the browser the same
this.render('login');
// stop the rest of the before hooks and the action function
pause();
}
},
2 - 這隻有路線沒有layoutTemplate
。如果它有一個,login
模板將顯示在layoutTemplate
的{{>yield}}
中。這通常不是您想要的登錄頁面。登錄頁面聽起來像自然的方式Router.go()或this.redirect()
定義路線:
都不行#2。然後,你可以這樣做:
Router.onBeforeAction(function(pause) {
if (!Meteor.user()) {
pause();
Router.go('\login');
}
}, {except: ['login']});
或者:
Router.onBeforeAction(function() {
if (!Meteor.user())
this.redirect('\login');
}, {except: ['login']});
但奇怪的是,還有一個問題,如果原來的路線(重定向之前)具有layoutTemplate
:在/login
模板的{{yield}}
內呈現。這又不是你通常想要的(並且絕對不是你期望的,因爲/login
模板沒有定義layoutTemplate
)。
我找到了一種方法來部分地解決這個問題:
Router.onBeforeAction(function() {
if (!Meteor.user()) {
var that = this;
setTimeout(function() { that.redirect('\login'); }, 0);
}
}, {except: ['login']});
現在一切都很好:在/login
模板呈現爲一個乾淨的網頁...除了原路線的layoutTemplate
的/login
模板之前短暫地閃爍被展示。
你有沒有同樣的問題?
它的作品,感謝凱利!我所要做的就是'Router.onBeforeAction(function(){if(!Meteor.userId())this.setLayout(「login」); \t}},{except:['login']});''看起來沒有必要調用'pause()' – steph643
很高興幫忙!同樣,搞清楚這實際上有助於我學習鐵路路由器工作方式的新知識。 –
'setLayout(undefined)'保持登錄佈局,所以我不得不創建一個空白模板,只是產生,並將您的最後一行改爲'this.setLayout(this.lookupLayoutTemplate()||'blank');' – Loren