以下是一段视图代码。如果没有m.redraw(),为什么它会工作?如果我没有调用它,路由会更改并且登录控制器会加载,但不会将任何内容呈现到DOM中。
home.view = function(ctrl) {
console.log('in home view');
if (!mo_portal.logged_in) {
console.log('redirecting to login');
m.route("/login");
m.redraw();
return;
}
return m("div","HOME");
}
答案 0 :(得分:3)
更改路线将始终触发重绘。如果您在没有手动调用m.redraw
的情况下没有看到登录页面视图,则可能是登录控制器或路径更改重绘期间发生的错误 - 错误情况重置时出现的错误你再次致电m.redraw
。
这是使用登录视图和控制器扩展您的代码。 mo_portal.logged_in
设置为true或false,具体取决于用户是否为usersList
中的用户,因此我们可以测试成功和失败。
我拿出m.redraw
(我也把重定向逻辑放在家用控制器中),一切正常。
var usersList = [
'john',
'alexia'
];
var mo_portal = {
username : '',
logged_in: false
};
var login = {};
login.controller = function(){
this.username = function( input ){
if( arguments.length ){
mo_portal.username = input;
mo_portal.logged_in = !!~usersList.indexOf( input );
}
return mo_portal.username;
};
};
login.view = function(ctrl){
console.log('in login view');
return [
m( 'input', { oninput : m.withAttr( 'value', ctrl.username ), value : ctrl.username() } ),
m( 'a[href=/home]', { config : m.route }, 'Login' )
];
};
var home = {};
home.controller = function(){
if (!mo_portal.logged_in) {
console.log('redirecting to login');
m.route("/login");
}
};
home.view = function(ctrl) {
console.log('in home view');
return m("div","HOME");
};
m.route( document.body, '/login', {
'/login' : login,
'/home' : home
} );

<script src="https://rawgit.com/lhorie/mithril.js/next/mithril.js"></script>
&#13;
答案 1 :(得分:1)
我认为这不是如何使用秘银。在正在进行的视图构建过程中,秘银不期望视图更新(也就是重绘)。
我想你应该在相关的控制器中进行路由更改。
请记住,视图会以某种方式随时更改页面。您可能不想检查登录状态的外转时间。