Open chestozo opened 9 years ago
Есть же такая проверка уже https://github.com/yandex-ui/noscript/blob/master/src/ns.view.js#L707
@doochik Она cрабатывает только когда вызывается view.update
для async видов.
Этого не происходит, когда мы вызываем на сервере update.generateHTML
.
Мой фикс делает так, что первая отрисовка (синхронных видов) отрисует валидные асинхронные виды как синхронные (раз у них isModelsValid() === true
значит их уже можно отрисовать).
Примерно понял почему так, но нужен тест
А еще для таких видов запустится дублирующий update, потому что он добавит себя как async https://github.com/yandex-ui/noscript/blob/fix.515/src/ns.update.js#L219
А еще для таких видов запустится дублирующий update, потому что он добавит себя как async
Не запустится, когда рендерим на сервере.
КМК надо сразу рендерить как sync (после моего фикса так и будет). Тест сделаю :)
Запустится, когда все это будет работать в браузере
Еще я тут подумал про сам баг.
Если вид объявлени как async, то на сервере мы его не рендерим, так заложено изначально. Почему тут вдруг появляются странные кейсы? Ну не отрендерится он, приедет все в браузер, там дорендерит, в этом и суть async. В чем проблема-то?
@doochik я описал кейс в #515.
Есть такой интересный кейс: есть async вид, который зависит от какого-то набора моделей. Когда мы рендерим на сервере страницу запрашиваются модели только для синхронных видов.
В нашем интересном кейсе получается так, что синхронные модели включают модели, нужные нашему асинхронному виду.
В итоге на сервере рендерится мода ns-view-async-content, а на клиенте мода ns-view-content не рендерится.
Ну т.е. получается во время reconstruct:
- модели все есть и валидны
- нода для вида уже отрендеренная пришла (хотя и async, но это не видно в HTML)
- из этого всего мы делаем вывод, что вид уже отрендерился синхронно на сервере (что не является правдой) и ничего с ним не делаем.
Договорились на том, что ориентироваться на isModelsValid()
не хорошо, потому что никто не гарантирует, что на клинте не появятся модели какие-нибудь неожиданно, которых не было на сервере.
И тогда мы посчитаем, что async вид рендерился как sync и не станем его перерисоввывать.
Решили, что надо отмечать таки прямо в HTML вида, что он рендерился как async. И тогда его жёстко перерисоввывать на клиенте.
Да, такое поведение исправит проблему в корне. А этот фикс, если его оставим, будет просто являться оптимизацией процесса.
fix для #515