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

ルートを変更すると、常に redraw がトリガーされます。手動で呼び出さないとログイン ページ ビューが表示されない場合は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>

于 2014-10-15T11:27:03.330 に答える
1

それはミスリルの使い方ではないと思います。Mithril は、進行中のビューの構築中にビューの更新 (別名、再描画) を想定していません。

関連するコントローラーでルート変更を行う必要があると思います。

ページが何らかの形で変更されるたびに、ビューがレンダリングされることに注意してください。おそらく、ログイン状態を毎回チェックしたくないでしょう。

于 2014-10-14T18:36:38.127 に答える