Skip to content

Commit cc46ce7

Browse files
committed
multiple improvements to server-side rendering
1 parent 448cc8a commit cc46ce7

24 files changed

+551
-433
lines changed

dist/blocks-source.js

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4981,19 +4981,18 @@ return result;
49814981
}
49824982
},
49834983

4984-
updateChildren: function (domQuery, collection, domElement) {
4984+
updateChildren: function (collection, updateCount, domQuery, domElement) {
49854985
var template = this._template;
49864986
var child = template[0];
49874987
var isOneChild = template.length === 1 && VirtualElement.Is(child);
49884988
var childNodes = domElement.childNodes;
49894989
var syncIndex = domQuery.getSyncIndex();
49904990
var childContexts = domQuery._context.childs;
49914991
var chunkLength = this._length();
4992-
var length = Math.min(collection.length, childNodes.length);
49934992
var index = -1;
49944993
var context;
49954994

4996-
while (++index < length) {
4995+
while (++index < updateCount) {
49974996
domQuery._context = context = childContexts[index];
49984997
context.$this = collection[index];
49994998
context.$parent = context.$parentContext.$this;
@@ -5882,8 +5881,12 @@ return result;
58825881
elementData.haveData = true;
58835882
if (!elementData.execute) {
58845883
elementData.execute = [];
5884+
elementData.executeHash = {};
5885+
}
5886+
if (!elementData.executeHash[methods[i].query]) {
5887+
elementData.execute.push(methods[i]);
5888+
elementData.executeHash[methods[i].query] = true;
58855889
}
5886-
elementData.execute.push(methods[i]);
58875890
continue;
58885891
}
58895892
Observer.startObserving();
@@ -7277,6 +7280,7 @@ return result;
72777280
*/
72787281
update: function () {
72797282
var elements = this._elements;
7283+
var elementData;
72807284
var domQuery;
72817285
var context;
72827286
var element;
@@ -7288,7 +7292,8 @@ return result;
72887292
context = expression.context;
72897293

72907294
if (!element) {
7291-
element = expression.element = ElementsData.data(expression.elementId).dom;
7295+
elementData = ElementsData.data(expression.elementId);
7296+
element = expression.element = elementData.dom;
72927297
}
72937298

72947299
try {
@@ -7302,15 +7307,22 @@ return result;
73027307
offset = expression.length - value.length;
73037308
expression.length = value.length;
73047309

7305-
if (expression.attr) {
7306-
element.setAttribute(expression.attr, Expression.GetValue(context, null, expression.entire));
7307-
} else {
7308-
if (element.nextSibling) {
7309-
element = element.nextSibling;
7310-
element.nodeValue = value + element.nodeValue.substring(expression.length + offset);
7310+
if (element) {
7311+
if (expression.attr) {
7312+
element.setAttribute(expression.attr, Expression.GetValue(context, null, expression.entire));
73117313
} else {
7312-
element.parentNode.appendChild(document.createTextNode(value));
7313-
}
7314+
if (element.nextSibling) {
7315+
element = element.nextSibling;
7316+
element.nodeValue = value + element.nodeValue.substring(expression.length + offset);
7317+
} else {
7318+
element.parentNode.appendChild(document.createTextNode(value));
7319+
}
7320+
}
7321+
} else {
7322+
element = elementData.virtual;
7323+
if (expression.attr) {
7324+
element.attr(expression.attr, Expression.GetValue(context, null, expression.entire));
7325+
}
73147326
}
73157327
});
73167328

@@ -7443,12 +7455,13 @@ return result;
74437455
return this;
74447456
}
74457457

7458+
array = blocks.unwrap(array);
7459+
74467460
var current = this.__value__;
74477461
var chunkManager = this._chunkManager;
74487462
var addCount = array.length - current.length;
74497463
var removeCount = Math.max(current.length - array.length, 0);
7450-
7451-
array = blocks.unwrap(array);
7464+
var updateCount = array.length - addCount;
74527465

74537466
Events.trigger(this, 'removing', {
74547467
type: 'removing',
@@ -7461,12 +7474,12 @@ return result;
74617474
items: array,
74627475
index: 0
74637476
});
7464-
7477+
74657478
chunkManager.each(function (domElement, virtualElement) {
74667479
var domQuery = blocks.domQuery(domElement);
74677480

74687481
domQuery.contextBubble(blocks.context(domElement), function () {
7469-
virtualElement.updateChildren(domQuery, array, domElement);
7482+
virtualElement.updateChildren(array, updateCount, domQuery, domElement);
74707483
});
74717484
});
74727485

@@ -7996,6 +8009,22 @@ return result;
79968009
newObservable.view._initialized = false;
79978010

79988011
newObservable.view.on('get', newObservable._getter);
8012+
8013+
newObservable.on('add', function () {
8014+
if (newObservable.view._initialized) {
8015+
newObservable.view._connections = {};
8016+
newObservable.view.reset();
8017+
ExtenderHelper.executeOperations(newObservable);
8018+
}
8019+
});
8020+
8021+
newObservable.on('remove', function () {
8022+
if (newObservable.view._initialized) {
8023+
newObservable.view._connections = {};
8024+
newObservable.view.reset();
8025+
ExtenderHelper.executeOperations(newObservable);
8026+
}
8027+
});
79998028

80008029
return newObservable;
80018030
},
@@ -8213,22 +8242,6 @@ return result;
82138242
filter: callback
82148243
});
82158244

8216-
observable.on('add', function () {
8217-
if (observable.view._initialized) {
8218-
observable.view._connections = {};
8219-
observable.view.reset();
8220-
ExtenderHelper.executeOperations(observable);
8221-
}
8222-
});
8223-
8224-
observable.on('remove', function () {
8225-
if (observable.view._initialized) {
8226-
observable.view._connections = {};
8227-
observable.view.reset();
8228-
ExtenderHelper.executeOperations(observable);
8229-
}
8230-
});
8231-
82328245
return observable;
82338246
};
82348247

@@ -10530,7 +10543,7 @@ return result;
1053010543
*/
1053110544
read: function (params, callback) {
1053210545
// TODO: Write tests for the callback checking if it is being called
10533-
var context = this.__context__;
10546+
var _this = this;
1053410547

1053510548
if (blocks.isFunction(params)) {
1053610549
callback = params;
@@ -10539,7 +10552,7 @@ return result;
1053910552
this._dataSource.read({
1054010553
data: params
1054110554
}, callback ? function () {
10542-
callback.call(context);
10555+
callback.call(_this.__context__);
1054310556
} : blocks.noop);
1054410557

1054510558
return this;
@@ -11215,11 +11228,7 @@ return result;
1121511228
this._started = true;
1121611229
this._serverData = window.__blocksServerData__;
1121711230
this._createViews();
11218-
if (document.__mock__ && window.__mock__) {
11219-
this._ready(element);
11220-
} else {
11221-
blocks.domReady(blocks.bind(this._ready, this, element));
11222-
}
11231+
blocks.domReady(blocks.bind(this._ready, this, element));
1122311232
}
1122411233
},
1122511234

@@ -11230,13 +11239,17 @@ return result;
1123011239
}, this));
1123111240
}, this);
1123211241
},
11233-
11234-
_ready: function (element) {
11235-
this._serverData = window.__blocksServerData__;
11242+
11243+
_startHistory: function () {
1123611244
this._history = new History(this.options);
1123711245
this._history
1123811246
.on('urlChange', blocks.bind(this._urlChange, this))
1123911247
.start();
11248+
},
11249+
11250+
_ready: function (element) {
11251+
this._serverData = window.__blocksServerData__;
11252+
this._startHistory();
1124011253
blocks.query(this, element);
1124111254
this._viewsReady(this._views);
1124211255
},

0 commit comments

Comments
 (0)