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.View] Когда async вид валидный нужно его рендерить синхронно #520

Open chestozo opened 9 years ago

chestozo commented 9 years ago

fix для #515

doochik commented 9 years ago

Есть же такая проверка уже https://github.com/yandex-ui/noscript/blob/master/src/ns.view.js#L707

chestozo commented 9 years ago

@doochik Она cрабатывает только когда вызывается view.update для async видов.

Этого не происходит, когда мы вызываем на сервере update.generateHTML.

Мой фикс делает так, что первая отрисовка (синхронных видов) отрисует валидные асинхронные виды как синхронные (раз у них isModelsValid() === true значит их уже можно отрисовать).

doochik commented 9 years ago

Примерно понял почему так, но нужен тест

doochik commented 9 years ago

А еще для таких видов запустится дублирующий update, потому что он добавит себя как async https://github.com/yandex-ui/noscript/blob/fix.515/src/ns.update.js#L219

chestozo commented 9 years ago

А еще для таких видов запустится дублирующий update, потому что он добавит себя как async

Не запустится, когда рендерим на сервере.

КМК надо сразу рендерить как sync (после моего фикса так и будет). Тест сделаю :)

doochik commented 9 years ago

Запустится, когда все это будет работать в браузере

doochik commented 9 years ago

Еще я тут подумал про сам баг.

Если вид объявлени как async, то на сервере мы его не рендерим, так заложено изначально. Почему тут вдруг появляются странные кейсы? Ну не отрендерится он, приедет все в браузер, там дорендерит, в этом и суть async. В чем проблема-то?

chestozo commented 9 years ago

@doochik я описал кейс в #515.

Есть такой интересный кейс: есть async вид, который зависит от какого-то набора моделей. Когда мы рендерим на сервере страницу запрашиваются модели только для синхронных видов.

В нашем интересном кейсе получается так, что синхронные модели включают модели, нужные нашему асинхронному виду.

В итоге на сервере рендерится мода ns-view-async-content, а на клиенте мода ns-view-content не рендерится.

Ну т.е. получается во время reconstruct:

  • модели все есть и валидны
  • нода для вида уже отрендеренная пришла (хотя и async, но это не видно в HTML)
  • из этого всего мы делаем вывод, что вид уже отрендерился синхронно на сервере (что не является правдой) и ничего с ним не делаем.
chestozo commented 9 years ago

Договорились на том, что ориентироваться на isModelsValid() не хорошо, потому что никто не гарантирует, что на клинте не появятся модели какие-нибудь неожиданно, которых не было на сервере.

И тогда мы посчитаем, что async вид рендерился как sync и не станем его перерисоввывать.

Решили, что надо отмечать таки прямо в HTML вида, что он рендерился как async. И тогда его жёстко перерисоввывать на клиенте.

doochik commented 9 years ago

Да, такое поведение исправит проблему в корне. А этот фикс, если его оставим, будет просто являться оптимизацией процесса.