Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ns.View + ns.Update: фикс кейса, когда мы пытаемся найти ноду для вложенного вида, тогда как родительский вид отрендерился в ошибочной моде #655

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

chestozo
Copy link
Member

@chestozo chestozo commented Jan 8, 2018

Есть, к примеру, такой лейаут

{
    parent: {
        nested: {}
    }
}

Вид parent зависит от модели m1.


Внутри метода ns.Update.prototype.render() есть такой код:

// начинаем цепочку с промиса, чтобы ловить ошибки в том числе и из _requestAllModels
// начинаем цепочку с промиса, чтобы ловить ошибки в том числе и из _requestAllModels
Vow.invoke(this._requestAllModels.bind(this))
    .then(function(result) {
        this._updateDOM();
        this._fulfill(result);
    }, this._reject, this)
    // еще один reject, чтобы ловить ошибки из #_updateDOM
    .then(null, this._reject, this);

Имеем дыру:
между вызовом _requestAllModels и _updateDOM может вклиниться асинхронный js код.
К примеру, мы запросили модель m1, она успешно вернулась и вообще всё идёт хорошо, метод _requestAllModels успешно завершается.

А где-то рядом вызвали:

setTimeout(function() {
    ns.Model.get('m1', {}).invalidate();
}, 0);

и так сложилось, что код выполнился после _requestAllModels, но перед _updateDOM.
В этом случае parent рендерится в error моде.
При этом, если не задать ns-view-error-content шаблон для parent, в котором будет ещё и рендеринг вида nested - получаем исключение Can't find node for 'nested'.


Идея фикса такая:

  • у нас есть updateTree в ns.Update
  • в нём для случая, когда parent в error моде, - будет пустой views: {} (в обычной моде там был бы views: { nested: { ... } })
  • исходя из этих знаний мы можем не пытаться искать ноду для вида, которого изначально не было в updateTree.

Roman Kartsev added 2 commits January 9, 2018 14:55
- do not try to find node for view if it is not in the update tree
@chestozo chestozo force-pushed the fix-view-view-error-state branch from 4a2d461 to ea55efe Compare January 9, 2018 11:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant