| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- /**
- * DevExtreme (ui/widget/bindable_template.js)
- * Version: 19.1.16
- * Build date: Tue Oct 18 2022
- *
- * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
- * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
- */
- "use strict";
- var $ = require("../../core/renderer");
- var TemplateBase = require("./ui.template_base");
- var eventsEngine = require("../../events/core/events_engine");
- var removeEvent = require("../../core/remove_event");
- var iteratorUtils = require("../../core/utils/iterator");
- var isPrimitive = require("../../core/utils/type").isPrimitive;
- var watchChanges = function() {
- var start = function(rawData, watchMethod, fields, fieldsMap, callback) {
- var fieldsDispose;
- var 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(data, watchMethod, callback) {
- return watchMethod(function() {
- return data
- }, callback)
- };
- var fieldsWatch = function(data, watchMethod, fields, fieldsMap, callback) {
- var resolvedData = {};
- var 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(render, fields, watchMethod, fieldsMap) {
- this._render = render;
- this._fields = fields;
- this._fieldsMap = fieldsMap || {};
- this._watchMethod = watchMethod
- },
- _renderCore: function(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()
- }
- });
|