Skip to content

Commit 5fe4da7

Browse files
author
Roman Kartsev
committed
fixes #660
- update valid view node if it was rendered and inserted inside parent view node
1 parent 81db195 commit 5fe4da7

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

src/ns.view.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,13 +1216,26 @@
12161216
options_next = updateOptions;
12171217
}
12181218

1219+
var viewNode;
1220+
var extractedViewNode = node ? this._extractNode(node) : null;
12191221
var viewWasInvalid = !this.isValid();
12201222

1221-
var viewNode;
1223+
// Особый случай, когда нужно обновить ноду вида:
1224+
// обновилась нода родительского вида, при этом текущий вид был валиден.
1225+
// @see #660
1226+
var viewNodeWasInvalid = (
1227+
this.isValid() &&
1228+
this.node &&
1229+
extractedViewNode &&
1230+
extractedViewNode !== this.node &&
1231+
updateOptions.parent_added &&
1232+
!updateOptions.toplevel
1233+
);
1234+
12221235
// Если блок уже валидный, ничего не делаем, идем ниже по дереву.
1223-
if ( viewWasInvalid ) {
1236+
if ( viewWasInvalid || viewNodeWasInvalid ) {
12241237
// Ищем новую ноду блока.
1225-
viewNode = this._extractNode(node);
1238+
viewNode = extractedViewNode;
12261239
ns.View.assert(!!viewNode, 6, [this.id]);
12271240

12281241
// Обновляем весь блок.
@@ -1276,6 +1289,7 @@
12761289

12771290
// Т.к. мы, возможно, сделали replaceNode, то внутри node уже может не быть
12781291
// никаких подблоков. В этом случае, нужно брать viewNode.
1292+
// TODO фалбек на node - совсем не понятно, зачем :/
12791293
viewNode = viewNode || node;
12801294

12811295
// Рекурсивно идем вниз по дереву, если не находимся в async-режиме

test/spec/ns.view.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1155,7 +1155,7 @@ describe('ns.View', function() {
11551155

11561156
});
11571157

1158-
describe('updateHTML', function() {
1158+
describe('#_updateHTML()', function() {
11591159

11601160
describe('redraw async view with child depens on same model', function() {
11611161

@@ -1389,6 +1389,44 @@ describe('ns.View', function() {
13891389

13901390
});
13911391

1392+
describe('обновление ноды валидного вида, вложенного в бокс', function() {
1393+
beforeEach(function() {
1394+
ns.View.define('view-1');
1395+
this.view = ns.View.create('view-1');
1396+
this.view.node = document.createElement('div');
1397+
this.view.asyncState = false;
1398+
1399+
this.newViewNode = document.createElement('div');
1400+
this.nodeFromUpdate = document.createElement('div');
1401+
1402+
this.sinon.stub(this.view, '_extractNode').withArgs(this.nodeFromUpdate).returns(this.newViewNode);
1403+
this.sinon.stub(this.view, 'isValid').returns(true);
1404+
this.sinon.stub(this.view, 'isLoading').returns(false);
1405+
this.sinon.stub(this.view, 'isOk').returns(true);
1406+
1407+
this.sinon.stub(this.view, '__onHide');
1408+
this.sinon.stub(this.view, '__onHtmldestroy');
1409+
this.sinon.stub(this.view, '_htmlinit');
1410+
this.sinon.stub(this.view, '_saveModelsVersions');
1411+
this.sinon.stub(this.view, '_show');
1412+
this.sinon.stub(this.view, '_apply');
1413+
this.sinon.stub(this.view, '_setNode');
1414+
});
1415+
1416+
it('должен подновить ноду валидного вида', function() {
1417+
var updateOptions = { toplevel: false, parent_added: true };
1418+
var events = {
1419+
'ns-view-touch': []
1420+
};
1421+
1422+
this.view._updateHTML(this.nodeFromUpdate, updateOptions, events);
1423+
1424+
expect(this.view._setNode)
1425+
.to.have.callCount(1)
1426+
.and
1427+
.to.be.calledWithExactly(this.newViewNode);
1428+
});
1429+
});
13921430
});
13931431

13941432
describe('ns.View update after model destruction', function() {

0 commit comments

Comments
 (0)