Mam konfigurację zagnieżdżonego widoku, która może nieco zagłębić się w mojej aplikacji. Jest kilka sposobów na inicjalizację, renderowanie i dołączanie widoków podrzędnych, ale zastanawiam się, jaka jest powszechna praktyka.
Oto kilka, o których myślałem:
initialize : function () {
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function () {
this.$el.html(this.template());
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
Zalety: nie musisz martwić się o utrzymanie właściwej kolejności DOM podczas dołączania. Widoki są inicjalizowane wcześnie, więc funkcja renderująca nie ma tak wiele do zrobienia na raz.
Wady: jesteś zmuszony do ponownego delegowania wydarzeń (), co może być kosztowne? Funkcja renderowania widoku nadrzędnego jest zaśmiecona całym renderowaniem widoku podrzędnego, które musi nastąpić? Nie masz możliwości ustawienia tagName
elementów, więc szablon musi utrzymywać poprawne nazwy tagów.
Inny sposób:
initialize : function () {
},
render : function () {
this.$el.empty();
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
this.$el.append(this.subView1.render().el, this.subView2.render().el);
}
Zalety: nie musisz ponownie delegować wydarzeń. Nie potrzebujesz szablonu, który zawiera tylko puste symbole zastępcze, a Twoje tagName są ponownie definiowane przez widok.
Wady: Musisz teraz upewnić się, że dodałeś rzeczy we właściwej kolejności. Renderowanie widoku nadrzędnego jest nadal zaśmiecone przez renderowanie widoku podrzędnego.
W przypadku onRender
wydarzenia:
initialize : function () {
this.on('render', this.onRender);
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function () {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function () {
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
Zalety: logika widoku podrzędnego jest teraz oddzielona od metody widoku render()
.
W przypadku onRender
wydarzenia:
initialize : function () {
this.on('render', this.onRender);
},
render : function () {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function () {
this.subView1 = new Subview();
this.subView2 = new Subview();
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
W pewnym sensie wymieszałem i dopasowałem kilka różnych praktyk we wszystkich tych przykładach (przepraszam za to), ale jakie są te, które chciałbyś zachować lub dodać? a czego byś nie zrobił?
Podsumowanie praktyk:
- Utworzyć instancję podglądów podrzędnych w
initialize
lub wrender
? - Wykonać całą logikę renderowania widoku podrzędnego w
render
lub wonRender
? - Użyj
setElement
lubappend/appendTo
?
close
metodę i narzędzie, onClose
które czyści dzieci, ale jestem po prostu ciekawy, jak je utworzyć i renderować.
delete
w JS to nie to samo, co delete
z C ++. Jeśli o mnie chodzi, jest to bardzo słabo nazwane słowo kluczowe.