0

meteor を別の JS フレームワークと統合しようとしています。最新の Blaze アップグレード (つまり、バージョン 0.8 より前) の前に、かなりうまく機能していました。これを機能させるには、meteor テンプレートを 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

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 に答える