template.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /**
  2. * DevExtreme (integration/knockout/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 domAdapter = require("../../core/dom_adapter");
  12. var ko = require("knockout");
  13. var typeUtils = require("../../core/utils/type");
  14. var TemplateBase = require("../../ui/widget/ui.template_base");
  15. var domUtils = require("../../core/utils/dom");
  16. var getClosestNodeWithContext = require("./utils").getClosestNodeWithContext;
  17. var getParentContext = function(data) {
  18. var parentNode = domAdapter.createElement("div");
  19. ko.applyBindingsToNode(parentNode, null, data);
  20. var parentContext = ko.contextFor(parentNode);
  21. ko.cleanNode(parentNode);
  22. return parentContext
  23. };
  24. var KoTemplate = TemplateBase.inherit({
  25. ctor: function(element) {
  26. this._element = element;
  27. this._template = $("<div>").append(domUtils.normalizeTemplateElement(element));
  28. this._registerKoTemplate()
  29. },
  30. _registerKoTemplate: function() {
  31. var template = this._template.get(0);
  32. new ko.templateSources.anonymousTemplate(template).nodes(template)
  33. },
  34. _prepareDataForContainer: function(data, container) {
  35. if (container && container.length) {
  36. var containerElement = container.get(0);
  37. var node = getClosestNodeWithContext(containerElement);
  38. var containerContext = ko.contextFor(node);
  39. data = void 0 !== data ? data : ko.dataFor(node) || {};
  40. if (containerContext) {
  41. return data === containerContext.$data ? containerContext : containerContext.createChildContext(data)
  42. }
  43. }
  44. return getParentContext(data).createChildContext(data)
  45. },
  46. _renderCore: function(options) {
  47. var model = this._prepareDataForContainer(options.model, $(options.container));
  48. if (typeUtils.isDefined(options.index)) {
  49. model.$index = options.index
  50. }
  51. var $placeholder = $("<div>").appendTo(options.container);
  52. var $result;
  53. ko.renderTemplate(this._template.get(0), model, {
  54. afterRender: function(nodes) {
  55. $result = $(nodes)
  56. }
  57. }, $placeholder.get(0), "replaceNode");
  58. return $result
  59. },
  60. source: function() {
  61. return $(this._element).clone()
  62. },
  63. dispose: function() {
  64. this._template.remove()
  65. }
  66. });
  67. module.exports = KoTemplate;