2013-12-09 11 views
6

Mam szablon nokaut:Jquery nokaut: Render szablon w pamięci

<script id="draggableHelper" type="text/x-jquery-tmpl"> 
    <div class="draggableHelper"> 
     <span data-bind="text: Name"></span> 
    </div> 
</script> 

można wygenerować wynik szablonu i zapisać go w pamięci, wysyłając przedmiot, aby wypełnić szablon?

Coś jak:

var result = ko.renderTemplate($("#draggableHelper").html(), { Name: "Test" }); 
+0

Wątpię, ponieważ Knockout nie jest silnikiem szablonowym. W żadnym momencie nie buduje "łańcucha znaków" czegoś. Możesz 'subscribe()' do obserwowalnego i pobrać 'innerHTML' z odpowiedniego węzła. – Tomalak

+0

"Natywny szablon to mechanizm, który określa powiązanie z przepływem foreach, if, with i innym sterowaniem. Wewnętrznie, te powiązania przepływu sterowania przechwytują znaczniki HTML zawarte w elemencie i używają go jako szablonu do renderowania względem dowolnego elementu danych. Ta funkcja jest wbudowana w Knockout i nie wymaga żadnej zewnętrznej biblioteki "- http://knockoutjs.com/documentation/template-binding.html – Dimitri

Odpowiedz

14

Tak to jest możliwe zastosowanie do wiązania węzłów przyłączone do DOM. Wystarczy użyć bardzo przydatnej funkcji ko.applyBindingsToNode, aby osiągnąć pożądany rezultat.

ko.renderTemplateX = function(name, data){ 
    // create temporary container for rendered html 
    var temp = $("<div>"); 
    // apply "template" binding to div with specified data 
    ko.applyBindingsToNode(temp[0], { template: { name: name, data: data } }); 
    // save inner html of temporary div 
    var html = temp.html(); 
    // cleanup temporary node and return the result 
    temp.remove(); 
    return html; 
}; 

Spójrz na ten mały przykład: http://jsfiddle.net/6s4gq/

Aktualizacja:

Pierwotnie była metoda ko.renderTemplate ale nie ma wbudowanej metody w Knockout o tej samej nazwie. Zastąpienie ko.renderTemplate może przerwać pracę aplikacji, zwłaszcza jeśli używasz wiązania template. Bądź ostrożny!

+2

OSTRZEŻENIE:' ko.renderTemplate' jest już zdefiniowane w nokaucie. Ten zły kod sprawił, że przez dwa kolejne dni rozbijałem głowę o ścianę, próbując odkryć, dlaczego wszystkie moje szablony "nie w pamięci" powodują błąd "poza przestrzenią stosu". Zmień nazwę, proszę! –

+1

@DaviFiamenghi, nie mogę wyrazić, jak bardzo przepraszam za twój luźno spędzony czas! Zaktualizowałem swoją odpowiedź. Dzięki! –

+1

Haha dzięki za twój mizerykord, proszę pana. I przepraszam za dramat, byłem trochę rozdrażniony w momencie odpowiedzi –

0

Odpowiedź f_martinez jest bardzo zbliżona do tego, czego potrzebowałem, po prostu musiałem określić silnik szablonu, aby działał. Moja funkcja:

var renderTemplate = function (name, data) { 
    // create temporary container for rendered html 
    var temp = $("<div>"); 

    // apply "template" binding to div with specified data 
    var options = { 
     template: { 
      name: name, 
      data: data, 
      templateEngine: new ko.nativeTemplateEngine() 
     } 
    }; 

    ko.applyBindingsToNode(temp[0], options); 

    // save inner html of temporary div 
    var html = temp.html(); 

    // cleanup temporary node and return the result 
    temp.remove(); 

    return html; 
};