bindable_template.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /**
  2. * DevExtreme (ui/widget/bindable_template.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var $ = require("../../core/renderer");
  11. var TemplateBase = require("./ui.template_base");
  12. var eventsEngine = require("../../events/core/events_engine");
  13. var removeEvent = require("../../core/remove_event");
  14. var iteratorUtils = require("../../core/utils/iterator");
  15. var isPrimitive = require("../../core/utils/type").isPrimitive;
  16. var watchChanges = function() {
  17. var start = function(rawData, watchMethod, fields, fieldsMap, callback) {
  18. var fieldsDispose;
  19. var globalDispose = globalWatch(rawData, watchMethod, function(dataWithRawFields) {
  20. fieldsDispose && fieldsDispose();
  21. if (isPrimitive(dataWithRawFields)) {
  22. callback(dataWithRawFields);
  23. return
  24. }
  25. fieldsDispose = fieldsWatch(dataWithRawFields, watchMethod, fields, fieldsMap, function(data) {
  26. callback(data)
  27. })
  28. });
  29. return function() {
  30. fieldsDispose && fieldsDispose();
  31. globalDispose && globalDispose()
  32. }
  33. };
  34. var globalWatch = function(data, watchMethod, callback) {
  35. return watchMethod(function() {
  36. return data
  37. }, callback)
  38. };
  39. var fieldsWatch = function(data, watchMethod, fields, fieldsMap, callback) {
  40. var resolvedData = {};
  41. var missedFields = fields.slice();
  42. var watchHandlers = iteratorUtils.map(fields, function(name) {
  43. var fieldGetter = fieldsMap[name];
  44. return watchMethod(fieldGetter ? function() {
  45. return fieldGetter(data)
  46. } : function() {
  47. return data[name]
  48. }, function(value) {
  49. resolvedData[name] = value;
  50. if (missedFields.length) {
  51. var index = missedFields.indexOf(name);
  52. if (index >= 0) {
  53. missedFields.splice(index, 1)
  54. }
  55. }
  56. if (!missedFields.length) {
  57. callback(resolvedData)
  58. }
  59. })
  60. });
  61. return function() {
  62. iteratorUtils.each(watchHandlers, function(_, dispose) {
  63. dispose()
  64. })
  65. }
  66. };
  67. return start
  68. }();
  69. module.exports = TemplateBase.inherit({
  70. ctor: function(render, fields, watchMethod, fieldsMap) {
  71. this._render = render;
  72. this._fields = fields;
  73. this._fieldsMap = fieldsMap || {};
  74. this._watchMethod = watchMethod
  75. },
  76. _renderCore: function(options) {
  77. var $container = $(options.container);
  78. var dispose = watchChanges(options.model, this._watchMethod, this._fields, this._fieldsMap, function(data) {
  79. $container.empty();
  80. this._render($container, data, options.model)
  81. }.bind(this));
  82. eventsEngine.on($container, removeEvent, dispose);
  83. return $container.contents()
  84. }
  85. });