0

这是一段视图代码。为什么没有 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");
}
4

2 回答 2

3

更改路线总是会触发重绘。如果您在没有手动调用m.redraw的情况下看不到登录页面视图,则可能是由于登录控制器中的错误或在路由更改重绘期间发生的视图 - 当您m.redraw再次调用时其失败条件被重置的错误。

这是带有登录视图和控制器的代码扩展。mo_portal.logged_in根据用户是否是其中之一设置为真或假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>

于 2014-10-15T11:27:03.330 回答
1

我认为这不是秘银的使用方式。Mithril 不希望在正在进行的视图构建期间进行视图更新(也称为重绘)。

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

请记住,每当页面以某种方式发生变化时都会呈现视图。您可能不想检查登录状态。

于 2014-10-14T18:36:38.127 回答