devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
98 lines (77 loc) • 3.04 kB
JavaScript
var $ = require("../../core/renderer"),
TemplateBase = require("./ui.template_base"),
eventsEngine = require("../../events/core/events_engine"),
removeEvent = require("../../core/remove_event"),
iteratorUtils = require("../../core/utils/iterator"),
isPrimitive = require("../../core/utils/type").isPrimitive;
var watchChanges = function () {
var start = function start(rawData, watchMethod, fields, fieldsMap, callback) {
var globalDispose, fieldsDispose;
globalDispose = globalWatch(rawData, watchMethod, function (dataWithRawFields) {
fieldsDispose && fieldsDispose();
if (isPrimitive(dataWithRawFields)) {
callback(dataWithRawFields);
return;
}
fieldsDispose = fieldsWatch(dataWithRawFields, watchMethod, fields, fieldsMap, function (data) {
callback(data);
});
});
return function () {
fieldsDispose && fieldsDispose();
globalDispose && globalDispose();
};
};
var globalWatch = function globalWatch(data, watchMethod, callback) {
return watchMethod(function () {
return data;
}, callback);
};
var fieldsWatch = function fieldsWatch(data, watchMethod, fields, fieldsMap, callback) {
var resolvedData = {},
missedFields = fields.slice();
var watchHandlers = iteratorUtils.map(fields, function (name) {
var fieldGetter = fieldsMap[name];
return watchMethod(fieldGetter ? function () {
return fieldGetter(data);
} : function () {
return data[name];
}, function (value) {
resolvedData[name] = value;
if (missedFields.length) {
var index = missedFields.indexOf(name);
if (index >= 0) {
missedFields.splice(index, 1);
}
}
if (!missedFields.length) {
callback(resolvedData);
}
});
});
return function () {
iteratorUtils.each(watchHandlers, function (_, dispose) {
dispose();
});
};
};
return start;
}();
module.exports = TemplateBase.inherit({
ctor: function ctor(render, fields, watchMethod, fieldsMap) {
this._render = render;
this._fields = fields;
this._fieldsMap = fieldsMap || {};
this._watchMethod = watchMethod;
},
_renderCore: function _renderCore(options) {
var $container = $(options.container);
var dispose = watchChanges(options.model, this._watchMethod, this._fields, this._fieldsMap, function (data) {
$container.empty();
this._render($container, data, options.model);
}.bind(this));
eventsEngine.on($container, removeEvent, dispose);
return $container.contents();
}
});
;