yandex-ui / noscript

Noscript: JavaScript MVC Framework for building SPA
http://yandex-ui.github.io/noscript/
MIT License
34 stars 22 forks source link

ns.box: последовательность видов внутри бокса не контроллируется #499

Closed chestozo closed 9 years ago

chestozo commented 9 years ago

Сделал скринкаст: http://cl.ly/340V2P1k3O0X

Суть проблемы: после обновления страницы виды, которые в layout указаны как a b могут оказаться в последовательности b a.

Происходит это из-за того, что обновлённая нода вида просто append-ится в box где-то тут.

chestozo commented 9 years ago

Я помню, мы на это натыкались, но не нашёл issue про это.

chestozo commented 9 years ago

/cc @doochik @edoroshenko готово

vitkarpov commented 9 years ago

Точняк. Тоже натыкался на такое.

Получается так: отрисовались вьюшки в боксе последовательно, все хорошо, потом первая вьюшка скрывается, отрисовывается ее другой инстанс (параметры поменялись) в конце бокса, а вторая на месте — вьюшки поменялись местами визуально.

chestozo commented 9 years ago

@vitkarpov ага ) там даже в коде была заметка про это :)

chestozo commented 9 years ago

Следующая issue будет юбилейная )

doochik commented 9 years ago

:+1: Есть оговорка: это может стать проблемой производительности. У нас есть метрики и мы это можем померить. Если будут проблему, то можно улучшить через дешевый compareDocumentPosition

chestozo commented 9 years ago

Добавил ещё один тест.

edoroshenko commented 9 years ago

:+1:

chestozo commented 9 years ago

Нашли проблему: из-за перестановки ноды вида ломается flash баннер. Есть вид, в нём отрендерена реклама. Достаточно вызвать ns.page.go() - баннер пропадает.

UPDATE 1: баннер должен находится внутри вида, а вид внутри бокса, где несколько видов.

chestozo commented 9 years ago

В общем, мне уже не очень нравится этот фикс, потому что мы на пустом месте мутируем DOM http://monosnap.com/file/nkJroWXwB5QdWspBLpeAnuOpIrnezS хотя @doochik говорит, это небольшой напряг для браузера.

doochik commented 9 years ago

Я тут написал простой тест.

var div1 = document.createElement('div');
console.time('insert div');
document.body.appendChild(div1);
console.timeEnd('insert div');

console.time('reinsert div');
document.body.appendChild(div1);
console.timeEnd('reinsert div');

var div2 = document.createElement('div');
console.time('insert div twice');
document.body.appendChild(div2);
document.body.appendChild(div2);
console.timeEnd('insert div twice');

insert div - 0.02мс reinsert div - 0.002мс insert div twice - 0.02мс

chestozo commented 9 years ago

Меня смущают 2 вещи: 1) лишние действия, которые никому не нужны 2) лишние мутации DOMа, которые могут привести к непредвиденным эффектам

К примеру, для такого layout (слева) вызов ns.page.go() приведёт к такому набору действий (справа): ns.page.go()

chestozo commented 9 years ago

Вот ещё нашли проблему: в FF теряется focus после таких перестановок в DOMе. Буду думать, как ещё это решить.

chestozo commented 9 years ago

Сделал другой заход на туже проблему #502