diff --git a/examples/timeline/other/usingReact.html b/examples/timeline/other/usingReact.html new file mode 100644 index 000000000..f6d1e1f71 --- /dev/null +++ b/examples/timeline/other/usingReact.html @@ -0,0 +1,123 @@ + + + + + React Components in templates + + + +
+ + + + + + + + + + + + + diff --git a/lib/timeline/component/Group.js b/lib/timeline/component/Group.js index f522fd82e..691d24b16 100644 --- a/lib/timeline/component/Group.js +++ b/lib/timeline/component/Group.js @@ -87,10 +87,12 @@ Group.prototype._create = function() { Group.prototype.setData = function(data) { // update contents var content; + var templateFunction; + if (this.itemSet.options && this.itemSet.options.groupTemplate) { - content = this.itemSet.options.groupTemplate(data, this.dom.inner); - } - else { + templateFunction = this.itemSet.options.groupTemplate.bind(this); + content = templateFunction(data, this.dom.inner); + } else { content = data && data.content; } @@ -100,11 +102,11 @@ Group.prototype.setData = function(data) { this.dom.inner.removeChild(this.dom.inner.firstChild); } this.dom.inner.appendChild(content); - } - else if (content !== undefined && content !== null) { + } else if (content instanceof Object) { + templateFunction(data, this.dom.inner); + } else if (content !== undefined && content !== null) { this.dom.inner.innerHTML = content; - } - else { + } else { this.dom.inner.innerHTML = this.groupId || ''; // groupId can be null } diff --git a/lib/timeline/component/item/Item.js b/lib/timeline/component/item/Item.js index e50918a8d..c70cc0a4f 100644 --- a/lib/timeline/component/item/Item.js +++ b/lib/timeline/component/item/Item.js @@ -187,31 +187,37 @@ Item.prototype._repaintDeleteButton = function (anchor) { */ Item.prototype._updateContents = function (element) { var content; + var templateFunction; + if (this.options.template) { var itemData = this.parent.itemSet.itemsData.get(this.id); // get a clone of the data from the dataset - content = this.options.template(itemData, element); - } - else { + templateFunction = this.options.template.bind(this); + content = templateFunction(itemData, element); + } else { content = this.data.content; } - var changed = this._contentToString(this.content) !== this._contentToString(content); - if (changed) { - // only replace the content when changed - if (content instanceof Element) { - element.innerHTML = ''; - element.appendChild(content); - } - else if (content != undefined) { - element.innerHTML = content; - } - else { - if (!(this.data.type == 'background' && this.data.content === undefined)) { - throw new Error('Property "content" missing in item ' + this.id); + if (content instanceof Object) { + templateFunction(itemData, element) + } else { + var changed = this._contentToString(this.content) !== this._contentToString(content); + if (changed) { + // only replace the content when changed + if (content instanceof Element) { + element.innerHTML = ''; + element.appendChild(content); + } + else if (content != undefined) { + element.innerHTML = content; + } + else { + if (!(this.data.type == 'background' && this.data.content === undefined)) { + throw new Error('Property "content" missing in item ' + this.id); + } } - } - this.content = content; + this.content = content; + } } };