2013-02-02 58 views
9

是否有一种干净的方式来定义/运行回调函数Mustache.js已经完成了渲染模板并将其插入到DOM中?例如,像这样:如何在Mustache.js完成渲染模板时运行回调

Mustache.render(template, viewModel, function() {...}); 

我已经能够拿出计数将被插入到DOM在我看来模型的节点数量,然后使用setInterval的检查最好DOM中存在许多节点。一旦他们这样做,我就可以调用我想要的功能。这对我来说似乎效率低下并且可能有问题,但我不知道还有什么要做。

回答

0

如果您还使用jQuery你可以使用:

$("#element").ready(function() { 
    // do something when Mustache.js has finished rendering 
}); 

Mustache.js具有流模板结果的能力。这在项目文件中有描述,但是是removed recently。我不确定这是否是有意的,但它似乎仍然有效。这描述了每次渲染模板块时调用的Mustache.to_html函数的可选回调参数。也许这可以帮助你解决问题。

+0

你不能使用'$(selector).ready(...'。这只适用于DOM初始化。 – andlrc

+0

你是对的,这只会第一次渲染元素。 –

+0

不,这只会告诉DOM准备就绪。不是别的。 – andlrc

3

与胡子无关,实际上它是关于jQuery .html()。

$( 'your_div')HTML(渲染).promise()来实现(函数(){

// do your stuff 

})。

+1

什么是渲染变量?这没有定义。 –

+1

@MartinBurch我认为它是'Mustache.render(...)' –

+0

@MartinBurch使用这个'var rendered =“

test
”;'在示例之前。 – Jessycormier

2

您不需要回调mustache.js的render()函数,因为它是同步的。 jquery的.html()也是同步的。

如果你真的需要一个回调(无论何种原因),你可以自己编写它:

var myrender = function(template, viewModel, callback) 
{ 
    Mustache.render(template, viewModel); 
    if(typeof callback === "function") 
     callback(); 
} 

// usage: 
myrender(my_template, my_viewModel, function(){ 
    alert("I can do anything here!"); 
}); 
+0

如果您在等待Mustache.render中的内容完成渲染并且回调在完成之前运行,该怎么办? – Jessycormier

+1

@Jessycormier就像我在我的回答中提到的 - 'Mustache.render()'是同步的 - 所以这不会发生。 –

+0

我很抱歉没有清楚地阅读你的答案:)谢谢你的提示! – Jessycormier

0

您可以使用这样的事情:

displayData: function() { 
    app.renderTemplate("test", app.data, function (returnValue) { 
     $('.result').append(returnValue); 
    }); 

}, 


renderTemplate: function (templatefile, data, callback) { 
    var tpl = 'views/' + templatefile + '.mst'; 
    $.ajax(tpl, 
     { 
      dataType: "text", 
      success: function (template) { 
       var rendered = Mustache.render(template, data); 
       callback(rendered); 
      } 
     }); 
} 

具体如何做可以在这里找到: https://www.chaensel.de/mustache-js-return-rendered-result-to-callback-function/