0

Я пытаюсь использовать Twitter Bootstrap с Мифрилом. Обычно перерисовывается диалог с Bootstrap, завернутый в Mithril, но перерисовка в обработчике для события "show.bs.modal" скрывает диалоговое окно, оставляющее задний план. Он не решает даже с setTimeout, который должен обеспечивать другой контекст выполнения. Почему и как я могу это исправить?jquery.on ("show.bs.modal", m.redraw) развращает диалог

Вот простой PoC.

Gist: https://gist.github.com//8c84966696276f1bfa3e298edb53da2b

Rawgit (рабочая демо): https://rawgit.com//8c84966696276f1bfa3e298edb53da2b/raw/34b0ac625962ee830d63829107eeb0473c735375/poc.html

Короче говоря, это не работает.

jquery.on("shown.bs.modal",() => setTimeout(m.redraw, 2000)); 

ответ

0

m.redraw работает только для components, которые были установлены с m.mount или m.route.

Я сделал несколько изменений в код: https://jsbin.com/wegeyi/edit?js,output

  • Если положить ваш виртуальный код DOM в виде компонентов, а также изменить m.render к m.mount, мы можем заменить f с m.redraw.
  • Я добавил счетчик ничьей, чтобы указать, что код выполняется повторно, как и ожидалось.
  • DOM атрибуты, которые не являются функциями, как className, type и т.д. могут быть выражены в m()selector argument
+0

Спасибо, я применил некоторые изменения в PoC. Однако это не решает проблему. – 173210

+0

Я думал, что проблема в том, что вы не можете заставить 'setTimeout (m.redraw)' работать. Если вы посмотрите [демонстрацию, которую я вставил] (https://jsbin.com/wegeyi/edit?js,output), вы можете видеть, что число увеличивается через 2 секунды (и один раз каждый раз, когда вы нажимаете кнопку. отсутствует? – Barney

0

решенный: m.render перезаписывает className, который был изменен $(element).modal("show"), так что вы должны предотвратить это. У вас есть два варианта:

  1. Получить className после $(element).modal("show") и отражают его к модели.
  2. className в config, когда initialized является ложным.

Я выбираю 2. Это выглядит следующим образом:

m("div", { 
    config(element, initialized) { 
    if (!initialized) { 
     element.className = "modal fade"; 
     $(element) 
     .on("shown.bs.modal",() => setTimeout(m.redraw, 2000)) 
     .modal("show"); 
    } 
    } 
}, conentOfTheModalDialog); 
Смежные вопросы