devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
80 lines (78 loc) • 3.27 kB
JavaScript
/**
* DevExtreme (cjs/__internal/core/templates/m_bindable_template.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BindableTemplate = void 0;
var _events_engine = _interopRequireDefault(require("../../../common/core/events/core/events_engine"));
var _remove = require("../../../common/core/events/remove");
var _renderer = _interopRequireDefault(require("../../../core/renderer"));
var _template_base = require("../../../core/templates/template_base");
var _type = require("../../../core/utils/type");
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const watchChanges = function(rawData, watchMethod, fields, fieldsMap, callback) {
let fieldsDispose;
const globalDispose = ((data, watchMethod, callback) => watchMethod((() => data), callback))(rawData, watchMethod, (dataWithRawFields => {
fieldsDispose && fieldsDispose();
if ((0, _type.isPrimitive)(dataWithRawFields)) {
callback(dataWithRawFields);
return
}
fieldsDispose = function(data, watchMethod, fields, fieldsMap, callback) {
const resolvedData = {};
const missedFields = fields.slice();
const watchHandlers = fields.map((name => {
const fieldGetter = fieldsMap[name];
return watchMethod(fieldGetter ? () => fieldGetter(data) : () => data[name], (value => {
resolvedData[name] = value;
if (missedFields.length) {
const index = missedFields.indexOf(name);
if (index >= 0) {
missedFields.splice(index, 1)
}
}
if (!missedFields.length) {
callback(resolvedData)
}
}))
}));
return function() {
watchHandlers.forEach((dispose => dispose()))
}
}(dataWithRawFields, watchMethod, fields, fieldsMap, callback)
}));
return function() {
fieldsDispose && fieldsDispose();
globalDispose && globalDispose()
}
};
class BindableTemplate extends _template_base.TemplateBase {
constructor(render, fields, watchMethod, fieldsMap) {
super();
this._render = render;
this._fields = fields;
this._fieldsMap = fieldsMap || {};
this._watchMethod = watchMethod
}
_renderCore(options) {
const $container = (0, _renderer.default)(options.container);
const dispose = watchChanges(options.model, this._watchMethod, this._fields, this._fieldsMap, (data => {
$container.empty();
this._render($container, data, options.model)
}));
_events_engine.default.on($container, _remove.removeEvent, dispose);
return $container.contents()
}
}
exports.BindableTemplate = BindableTemplate;