2014-10-14 8 views
0

Вот фрагмент кода просмотра. Почему он не будет работать без m.redraw()? Если я не назову это, маршрут изменится и загрузится контроллер логина, но ничего не отображается в DOM.Почему мой пользовательский интерфейс MithrilJS не будет отображаться, если я не перезвоню после программного перенаправления?

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"); 
} 

ответ

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>

1

Я думаю, что это не так, как будет использоваться мифрил. Мифрил не ожидает обновления вида (ака перерисовывания) во время непрерывной конструкции просмотра.

Предположим, вам необходимо изменить маршрут в соответствующем контроллере.

Имейте ввиду, что представление отображается в evertime, страница как-то меняется. Вероятно, вы не хотите проверять время возврата в состояние входа в систему.