除非我在编程重定向后调用重绘,为什么我的MithrilJS UI不会呈现?

时间:2014-10-14 12:10:14

标签: mithril.js

以下是一段视图代码。如果没有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");
}

2 个答案:

答案 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;
&#13;
&#13;

答案 1 :(得分:1)

我认为这不是如何使用秘银。在正在进行的视图构建过程中,秘银不期望视图更新(也就是重绘)。

我想你应该在相关的控制器中进行路由更改。

请记住,视图会以某种方式随时更改页面。您可能不想检查登录状态的外转时间。