0

我正在尝试将流星与另一个 JS 框架集成。在最新的 Blaze 升级(即 0.8 之前的版本)之前,我的工作相当顺利。为了让它工作,我需要将流星模板呈现为 HTML 字符串。此外,我需要能够提供一个数据对象来为模板中包含的变量提供值。

在 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}}

我会显示跨度,但除了   之外没有其他内容。似乎在 if 块内时​​,它会丢失上下文并且不再看到“this”对象上的 myTemplateVariableData 属性。

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

4

2 回答 2

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>
于 2015-10-26T07:40:22.107 回答
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.

但这可能不是你想要的?

于 2014-04-07T07:12:42.830 回答