如何为给定的上下文数据对象(版本0.8+)从流星模板生成HTML输出

时间:2014-04-07 06:25:13

标签: javascript meteor meteor-blaze

我正在尝试将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>&nbsp;{{myTemplateVariableData.xxx}}</span>{{/if}}

我会显示跨度,但除了&amp; nbsp之外没有其他内容。好像在if块内部时,它会丢失上下文,并且无法再查看'this'对象上的myTemplateVariableData属性。

我怀疑有一种更简单的方法可以完成我在这里尝试做的事情,但我目前没有想法,所以我想我会在这里发帖,看看是否有其他人试图做类似的事情。

2 个答案:

答案 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.

但那可能不是你想要的?