yandex-ui / noscript

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

Обновлять лейаут, только если это не мешает настоящим переходам между… #659

Closed Epsilonnnn closed 5 years ago

Epsilonnnn commented 6 years ago

… страницами

chestozo commented 6 years ago

Меня всё ещё смущает такой кейс: https://github.com/yandex-ui/noscript/blob/master/src/ns.update.js#L472-L481

вот мы запустили this._requestAllModels.bind(this) модели запрашиваются, запрашиваются допустим уже мы получили m1, а m2 ещё запрашивается

в этот момент кто-то изменил m1 и запустил ns.page.go() и вот этот ns.page.go() мы по новой логике хотим отменить - а значит потеряем перерисовку так ведь?

chestozo commented 6 years ago

Собственно вопрос: может нам достаточно унести ns.page._setCurrent(route, url); на момент до вызова ns.page.followRoute(route)?

Как-то так:

ns.page._setCurrent(route, url); // СЮДА уношу
return ns.page.followRoute(route)
    .then(function() {
        // ns.page._setCurrent(route, url); - ТУТ комменчу
        ns.page._fillHistory(url, historyAction);

        // router says "redirect"
        if (route.page === ns.R.REDIRECT) {
            return ns.page.redirect(route.redirect);
        }

        ns.page.title();

        return ns.page.startUpdate(route);
    }, triggerPageErrorLoad);

?

Epsilonnnn commented 6 years ago

Ответ на первый глобальный коммент:

Да это реальный случай, и если внимательно посмотреть на проверку, то можно увидеть, что я не просто отменяю все ns.page.go(), если в это время есть переходы. Я специально не отменяю ns.page.go(), если у него оказался урл, который равен урлу текущего перехода. В таком случае переход должен быть корректным и обновление должно сработать.

Ответ на 2 глобальный коммент:

Насколько я понял, почему ns.page._setCurrent(route, url) ставится именно после followRoute - так как followRoute это подготовка к переходу на страницу, и если он зареджектится, то перехода не будет, а это означает, что если ставить ns.page._setCurrent(route, url) до followRoute, то в какой-то момент ns.page.currentUrl не будет совпадать с фактическим лейаутом, который отрисован

chestozo commented 6 years ago

image

chestozo commented 6 years ago

мне немного стрёмно, что мы храним _lastTransitionUrl (yate another url) кроме того, сейчас запущенный ns.page.go(url1) никогда не будет перебиваться ns.page.go() и мы таки теряем перерисовку?

Epsilonnnn commented 6 years ago

сделал сбрасывание lastTransition, после завершения. Апдейт текущей страницы не теряется из-за этого условия - https://github.com/yandex-ui/noscript/pull/659/files#diff-85b7bd891fc417d150d5803fe257a28dR153

razetdinov commented 5 years ago

Merged in #664.