From 49e7561e18cdf7c74c881840c72e68732903a3a7 Mon Sep 17 00:00:00 2001 From: Roman Kartsev Date: Mon, 8 Jan 2018 18:43:30 +0300 Subject: [PATCH 1/2] Fix: do not search for what is not there - do not try to find node for view if it is not in the update tree --- src/ns.update.js | 4 +++- src/ns.view.js | 26 +++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/ns.update.js b/src/ns.update.js index 5bb38809..9b7e12a6 100644 --- a/src/ns.update.js +++ b/src/ns.update.js @@ -321,6 +321,8 @@ this.view._getUpdateTree(tree); } + this.updateTree = tree; + this.log('created render tree', tree); this.stopTimer('collectViews'); @@ -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'); diff --git a/src/ns.view.js b/src/ns.view.js index c2331038..124505d5 100644 --- a/src/ns.view.js +++ b/src/ns.view.js @@ -1197,6 +1197,9 @@ * Обновляем (если нужно) ноду блока. * @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 */ @@ -1212,6 +1215,7 @@ // "my-root-view2": {/* tree 2 */} // } var options_next; + if (updateOptions.toplevel) { options_next = no.extend({}, updateOptions); @@ -1283,8 +1287,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); + } + } }); } }; From ea55efea7bc8577b0861c45e667d4b94ce236bec Mon Sep 17 00:00:00 2001 From: Roman Kartsev Date: Tue, 9 Jan 2018 12:17:24 +0300 Subject: [PATCH 2/2] Fix old typos --- src/ns.view.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/ns.view.js b/src/ns.view.js index 124505d5..f908a887 100644 --- a/src/ns.view.js +++ b/src/ns.view.js @@ -1204,12 +1204,9 @@ * @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 */}