我正在尝试将meteor与另一个JS框架集成。在最新的Blaze升级(即0.8版之前)之前,我的工作相当不错。为了使其工作,我需要将流星模板渲染为HTML字符串。此外,我需要能够提供数据对象,以提供模板中包含的变量的值。
Pre 0.8,我可以简单地执行以下操作:
var myTemplateName = 'someTemplateName';
var myTemplateVariableData = {myTemplateVariableData: {'xxx': 'some data}};
var myTemplateHTML = Template[myTemplateName].render(myTemplateVariableData);
当然,那不再有效。但是,我必须认为有一些方法可以做到这一点,甚至0.8后。我与以下内容非常接近:
var myTemplateVariableData = {'xxx': 'some data};
var templateName = 'someTemplateName';
var myTemplateHTML = "";
var dr = new UI.DomRange; // domain range
var loadedTemplate = Template[templateName].extend(
{
data: function () {
return { myTemplateVariableData: myTemplateVariableData }
}
}
);
var renderedTemplate = loadedTemplate.render();
UI.materialize(renderedTemplate, dr, null, dr.component);
for (var member in dr.members) {
if (dr.members.hasOwnProperty(member)) {
var testHTML = dr.members[member].innerHTML;
if (testHTML) {
myTemplateHTML = myTemplateHTML + testHTML
} else {
myTemplateHTML = myTemplateHTML + dr.members[member].textContent
}
}
}
这次尝试的结果是,如果我尝试这样的事情:
{{#if myTemplateVariableData.xxx}}<span> {{myTemplateVariableData.xxx}}</span>{{/if}}
我会显示跨度,但除了&amp; nbsp之外没有其他内容。好像在if块内部时,它会丢失上下文,并且无法再查看'this'对象上的myTemplateVariableData属性。
我怀疑有一种更简单的方法可以完成我在这里尝试做的事情,但我目前没有想法,所以我想我会在这里发帖,看看是否有其他人试图做类似的事情。
答案 0 :(得分:2)
我认为我的解决方案更直接:
function html(contextObject, templateName) {
return Blaze.toHTML(Blaze.With(contextObject, function() { return Template[templateName]; }));
}
使用:强>
模板文件
<template name="myTemplate">
<div id="{{myid}}"></div>
</template>
某些JS文件中的
var myhtml = html({myid : 11}, "myTemplate") //<div id="1"></div>
答案 1 :(得分:1)
要在标题中回答您的问题,您可以这样做:
var templateName = 'myTemplate'
var context = {randomNumber: 527}
var div = document.createElement('div')
var component = UI.renderWithData(Template[templateName], context)
UI.insert(component, div)
var htmlString = div.innerHTML // <-- What you want.
但那可能不是你想要的?