/
koExternalTemplateEngine.js
executable file
·102 lines (88 loc) · 3.41 KB
/
koExternalTemplateEngine.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Knockout External Template Engine
// Author: Jim Cowart
// License: MIT (http://www.opensource.org/licenses/mit-license)
// Version 2.0.5
// This is the 'standard js lib' style version of the KO External Template Engine
// If you need the AMD module version, please go to https://github.com/ifandelse/Knockout.js-External-Template-Engine
(function ( global, ko, jQuery, infuser, undefined ) {
var ExternalTemplateSource = function(templateId, options) {
var self = this, origAfterRender;
self.templateId = templateId;
self.loaded = false;
self.template = ko.observable(infuser.defaults.useLoadingTemplate ? infuser.defaults.loadingTemplate.content : undefined);
self.template.data = {};
self.options = ko.utils.extend({},options);
self.options.templateId = templateId;
if(self.options && self.options.afterRender) {
origAfterRender = self.options.afterRender;
self.options.afterRender = function() {
if(self.loaded) {
origAfterRender.apply(self.options, arguments);
}
};
}
};
ko.utils.extend(ExternalTemplateSource.prototype, {
data: function(key, value) {
if (arguments.length === 1) {
if(key === "precompiled") {
this.template();
}
return this.template.data[key];
}
this.template.data[key] = value;
},
text: function(value) {
if (!this.loaded) {
this.getTemplate();
}
if (arguments.length === 0) {
return this.template();
} else {
this.template(arguments[0]);
}
},
getTemplate: function() {
var self = this;
infuser.get(self.options, function(tmpl) {
self.data("precompiled",null);
self.template(tmpl);
self.loaded = true;
});
}
});
var KoExternalTemplateEngine = function(koEngineType) {
var engine = koEngineType ? new koEngineType() : new ko.nativeTemplateEngine();
engine.templates = {};
engine.makeTemplateSource = function(template, bindingContext, options) {
// Named template
if (typeof template == "string") {
var elem = document.getElementById(template);
if (elem)
return new ko.templateSources.domElement(elem);
else {
if(!engine.templates[template]) {
engine.templates[template] = new ExternalTemplateSource(template, options);
}
return engine.templates[template];
}
}
else if ((template.nodeType == 1) || (template.nodeType == 8)) {
// Anonymous template
return new ko.templateSources.anonymousTemplate(template);
}
};
engine.renderTemplate = function (template, bindingContext, options) {
var templateSource = engine.makeTemplateSource(template, bindingContext, options);
return engine.renderTemplateSource(templateSource, bindingContext, options);
};
return engine;
};
ko.KoExternalTemplateEngine = KoExternalTemplateEngine;
if (jQuery.tmpl && jQuery.tmpl.tag.tmpl.open.toString().indexOf('__') >= 0) {
ko.setTemplateEngine(new KoExternalTemplateEngine(ko.jqueryTmplTemplateEngine));
}
else {
ko.setTemplateEngine(new KoExternalTemplateEngine());
}
})( window, ko, jQuery, infuser );