Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/ns.update.js
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,8 @@
this.view._getUpdateTree(tree);
}

this.updateTree = tree;

this.log('created render tree', tree);
this.stopTimer('collectViews');

Expand Down Expand Up @@ -367,7 +369,7 @@
this.switchTimer('triggerHideEvents', 'insertNodes');

if (!this.view.destroyed) {
this.view._updateHTML(node, {toplevel: true}, viewEvents);
this.view._updateHTML(node, { toplevel: true, updateTree: this.updateTree }, viewEvents);
}

this.switchTimer('insertNodes', 'triggerEvents');
Expand Down
35 changes: 28 additions & 7 deletions src/ns.view.js
Original file line number Diff line number Diff line change
Expand Up @@ -1197,21 +1197,22 @@
* Обновляем (если нужно) ноду блока.
* @param {HTMLElement} node
* @param {object} updateOptions
* @package {boolean} updateOptions.toplevel
* @package {boolean} [updateOptions.parent_added]
* @package {ns.View~UpdateTree} [updateOptions.updateTree]
* @param {object} events
* @private
*/
ns.View.prototype._updateHTML = function(node, updateOptions, events) {
// FIXME nop@: Велик могучим русский языка!
// Падежи не сходятся вообще :(
//
// при обработке toplevel-view надо скопировать первоначальные updateOptions
// инчае, при обновлении параллельных веток дерева, toplevel оказажется только первая
// и, соответственно, DOM-надо обновиться только у нее
// При обработке toplevel-view надо скопировать первоначальные updateOptions,
// иначе при обновлении параллельных веток дерева toplevel-ом окажется только первая ветка
// и DOM-нода обновится только у нее.
// {
// "my-root-view1": {/* tree 1 */},
// "my-root-view2": {/* tree 2 */}
// }
var options_next;

if (updateOptions.toplevel) {
options_next = no.extend({}, updateOptions);

Expand Down Expand Up @@ -1283,8 +1284,28 @@

// Рекурсивно идем вниз по дереву, если не находимся в async-режиме
if (!this.asyncState) {
// Вычисляем поддерево updateTree для текущего вида.
var updateTree = updateOptions.updateTree ? updateOptions.updateTree.views[this.id] : null;
var parentId = this.id;

this._apply(function(view) {
view._updateHTML(viewNode, options_next, events);
// Обновляем вложенный вид если
// - для текущего вида не указан updateTree
// - для текущего вида указан updateTree и в нём присутствует вложенный вид
if (!updateTree || updateTree.views[view.id]) {
// Для вложенного вида передаём либо весь updateOptions.updateTree,
// либо своё поддерево updateOptions.updateTree.
var nested_update_tree = !updateTree ? updateOptions.updateTree : updateTree.views[view.id];
var nested_options_next = no.extend({}, options_next, { updateTree: nested_update_tree });

view._updateHTML(viewNode, nested_options_next, events);
}

if (ns.DEBUG) {
if (updateTree && !updateTree.views[view.id]) {
ns.log.debug('[ns.View] skip updating HTML for ' + view.id + ' inside ' + parentId, updateTree);
}
}
});
}
};
Expand Down