2013-02-02 16 views
9

Mustache.js bir şablon oluşturup DOM'a ekledikten sonra geri arama işlevini tanımlamanın/çalıştırmanın temiz bir yolu var mı? Böyle Örneğin, bir şey:Mustache.js, şablon oluşturmayı bitirdiğinde geri arama nasıl yapılır

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

ben olmadığını kontrol etmek setInterval kullanarak daha sonra DOM eklenecektir benim bakış modelinde düğümlerin sayısını sayma, ve ile gelip başardık iyi DOM'da birçok düğüm var. Yaptıkları zaman, istediğim işlevi arayabilirim. Bu bana verimsiz ve potansiyel olarak buggy gibi görünüyor, ama başka ne yapacağımı bilmiyorum. Ayrıca jQuery kullanıyorsanız

cevap

0

kullanabilirsiniz:

Mustache.js

$("#element").ready(function() { 
    // do something when Mustache.js has finished rendering 
}); 
şablon sonuçlarını akışı yeteneğine sahiptir. Bu, projenin belgelerinde açıklanmıştı, ancak removed recently idi. Bunun kasıtlı olup olmadığından emin değilim ama hala işe yarıyor gibi görünüyor. Bu, şablonun bir parçası oluşturulduğunda çağrılan Mustache.to_html işlevinin isteğe bağlı geri çağırma parametresini açıklar. Belki bu senin probleminle yardımcı olabilir.

+0

'$ (selector) .ready kullanamazsınız .ready (...'. Bu yalnızca DOM başlatılıyor için çalışır. – andlrc

+0

Doğru, bu yalnızca eleman ilk defa işlenir. –

+0

Hayır, bu yalnızca DOM'ın hazır olduğunu söylemek için çalışacaktır. Başka bir şey için değil. – andlrc

3

Mustache ile ilgili değil, aslında jQuery .html() ile ilgilidir.

$ ('your_div') html (işlenmiş) .promise() tamam (fonksiyonu() {

// do your stuff 

})..;

+1

"İşlenen" değişkeni nedir? Bu tanımlanmadı. –

+1

@MartinBurch Sanırım bu örnekte "Mustache.render (...)" –

+0

@MartinBurch bu "var rendered ="

test
"; – Jessycormier

2

mustache.js 'render() işlevi için bir geri çağırma gerek yoktur çünkü bu eşzamanlıdır. jquery'nin .html() da eşzamanlıdır.

Eğer gerçekten (herhangi bir nedenle) kendiniz kodlayabiliriz bir geri arama gerekiyorsa:

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); 
      } 
     }); 
} 

ayrıntılı nasıl yapılır olabilir:

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

Moustache.render içindeki içeriğin oluşturmayı bitirmesini ve geri çağrımın yapılmadan önce çalışmasını bekliyorsanız ne olacak? – Jessycormier

+1

@Jessycormier cevabımda belirttiğim gibi - "Mustache.render()" senkronize - bu olmayacak. –

+0

Cevabınızı açıkça okumadığım için özür dilerim :) Bahşiş için teşekkür ederim! – Jessycormier