UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

80 lines (58 loc) 2.43 kB
"use strict"; var $ = require("../../core/renderer"), domAdapter = require("../../core/dom_adapter"), ko = require("knockout"), typeUtils = require("../../core/utils/type"), TemplateBase = require("../../ui/widget/ui.template_base"), domUtils = require("../../core/utils/dom"); var getParentContext = function getParentContext(data) { var parentNode = domAdapter.createElement("div"); ko.applyBindingsToNode(parentNode, null, data); var parentContext = ko.contextFor(parentNode); ko.cleanNode(parentNode); return parentContext; }; var KoTemplate = TemplateBase.inherit({ ctor: function ctor(element) { this._element = element; this._template = $("<div>").append(domUtils.normalizeTemplateElement(element)); this._registerKoTemplate(); }, _registerKoTemplate: function _registerKoTemplate() { var template = this._template.get(0); new ko.templateSources.anonymousTemplate(template)['nodes'](template); }, _prepareDataForContainer: function _prepareDataForContainer(data, container) { if (container && container.length) { var containerElement = container.get(0); var containerContext = ko.contextFor(containerElement); data = data !== undefined ? data : ko.dataFor(containerElement) || {}; if (containerContext) { return data === containerContext.$data ? containerContext : containerContext.createChildContext(data); } } // workaround for https://github.com/knockout/knockout/pull/651 return getParentContext(data).createChildContext(data); }, _renderCore: function _renderCore(options) { var model = this._prepareDataForContainer(options.model, $(options.container)); if (typeUtils.isDefined(options.index)) { model.$index = options.index; } var $placeholder = $("<div>").appendTo(options.container); var $result; ko.renderTemplate(this._template.get(0), model, { afterRender: function afterRender(nodes) { $result = $(nodes); } }, $placeholder.get(0), "replaceNode"); return $result; }, source: function source() { return $(this._element).clone(); }, dispose: function dispose() { this._template.remove(); } }); module.exports = KoTemplate;