2012-12-19 10 views
11

Piszę przykładową aplikację przy użyciu pliku backbone.js.Renderowanie szkieletu Wyświetl aktualizację modelu

Na zaktualizowanej moim modelu I ponownie uczynić mój pogląd w ten sposób

$('.target').html(""); 
$('.target').append(this.$el.html(this.template(model))) 

Gdy widok jest ponownie wydanego po aktualizacji modelu [w sprawie zmian zdarzenia] Zdarzenia związane Dzieciom el „s pobiera lost [nie wydaje się być taki jak na żywo jQuery]. Czy jest to znany problem, czy też czegoś mi brakuje? Czy powinienem spróbować zastąpić html zamiast append? fiddle

+0

Być może zechcesz naprawić skrzypce tak, aby działało. na przykład. za pomocą jQuery oraz Incerscore i Backbone oraz –

+1

nie potrzebujesz dwóch instrukcji. Po prostu użyj jednego: '$ ('.cel'). Html (this. $ El.html (this.template (model)))', co jest równoznaczne z wyczyszczeniem kodu HTML i dodaniem nowego – Matanya

+0

@ Mike Fielden Then I może potrzebuję umieścić całą moją aplikację: DI myślał, że widok wystarczy, aby zrozumieć mój problem. – Tamil

Odpowiedz

10

Gdy widok jest w DOM, nie trzeba go dalej usuwać i dołączać. Myślę, że najprostszym sposobem zarządzania tym jest całkowite usunięcie wstawienia DOM z widoku i umożliwienie dzwoniącemu view.render zaopiekowania się nim.

Widok:

render: function() { 
    this.$el.html(this.template(model)); 
    return this; 
} 

dzwoniącego (na pierwszy render):

var view = new SomeView(); 
$('.target').append(view.render().el); 

Na późniejsze renderuje:

view.render(); 

Po pogląd została wygenerowana w DOM może zachować szczęśliwie ponownie renderowania się bez konieczności wiedzieć nic na temat widoków nadrzędnych. Powiązania zdarzeń powinny również pozostawać nienaruszone między renderami.

+0

Ale dodatek doda tę samą treść dwa razy lub tyle razy, ile razy będę aktualizował mój model rite coz 'append' zamiast zamieniać? – Tamil

+1

@ Punktem wyjścia jest to, że tylko raz "dodajesz", kiedy chcesz, aby widok był najpierw wyświetlany. Potem wystarczy wywołać 'render' w widoku, ponieważ' view. $ El' jest już w DOM. Zaktualizowałem swoją odpowiedź dla jasności. Ale tak, '$ .replaceWith' lub jakikolwiek inny sposób będzie miał taki sam rezultat. – jevakallio

+0

@fenciff Nie wiedziałem tego :) To działało naprawdę dobrze :) – Tamil

Powiązane problemy