2013-12-09 27 views
5

Próba wprowadzenia pola danych w aktualizacji szablonu narzędzia Handlebars po pobraniu modelu przypisanego do komponentu Marionette CompositeView, ale kod HTML na stronie nie jest aktualizowany.Jak zaktualizować dane po pobraniu modelu w szablonie Handlebars ze szkieletem i marionetką?

Mój kod wygląda następująco:

Model:

B.Page.Model = Backbone.Model.extend({ 
    url: function() { 
     return 'my/resource/'; 
    }, 
}); 


Widok:

B.Page.CompositeView = Backbone.Marionette.CompositeView.extend({ 
    template: Handlebars.compile(templates.find('#my-template').html()), 

    initialize: function(options) { 
     _.bindAll(this); 
     this.model.fetch(); 
    }, 
)}; 


Szablon:

<script id="my-template" type="text/x-handlebars-template"> 
    Date: <span id="my-data-field">{{data}}</span> 
</script> 

Sprawdziłem zasobu i robi powrót prawidłowego JSON z zestawem data pola. Ponadto model jest przekazywany do widoku.

Podejrzewam, że jest to spowodowane wywołaniem funkcji render po otrzymaniu danych; jednak chciałbym uzyskać informację zwrotną na temat tego, jak należy to zrobić.

Co to jest dobry sposób na zrobienie tego?

Dzięki!

EDYCJA: Ten widok złożony ma kolekcję, która jest z nim powiązana (co jest w porządku, gdy wyzwolę odpowiednie zdarzenie). Celowo pominąłem tę część kodu, aby uniknąć pomieszania problemu.

+1

Czy upewniłeś się, że został ponownie renderowany? Konieczne może być powiązanie zdarzenia aktualizacji z metodą wyświetlania widoku. –

+0

Dokładnie w prawo. Wielkie dzięki! –

Odpowiedz

3

Masz rację, ponieważ CompositeView rozciąga się od CollectionView, renderuje się tylko domyślnie przy zdarzeniach kolekcji. Aby uczynić go ponownie render na zmiany modelu, można zrobić coś takiego w swojej CompositeView:

initialize: function(){ 
    this.listenTo(this.model, "change", this.render); 
} 
+0

Dzięki. Rzeczywista składnia, której użyłem to 'this.model.on ('change', this.render)', ale jasne jest, że jest to ta sama koncepcja. –

+0

Tak, to ta sama koncepcja, ale istnieją drobne różnice: patrz [tutaj] (http://stackoverflow.com/questions/14041042/backbone-0-9-9-difference-between-listent-and-on) for przykład. –

1

widokami Marionette mieć obiekt modelEvents że jest związany z przekazywane w modelu. Możesz więc nieco poprawić zaakceptowaną odpowiedź, wykonując:

template: Handlebars.compile(templates.find('#my-template').html()), 

modelEvents: { 
    'change': 'render' 
} 

zamiast wiązania ręcznie w celu zainicjowania.