Wdrażam moją pierwszą, nie-tutorialową aplikację Backbone, i mam 2-pytające pytania dotyczące aspektu używania za pomocą metody backbone.js, która nie jest rozstrzygająca bardzo dobrze ze mną, co wiąże się z wstrzykiwaniem widoku el
do DOM vs. użycie istniejącego elementu dla el
. Podejrzewam, że dostarczę wam wszystkich "możliwych do nauczenia momentów" i doceniam pomoc.Dołączanie widoków backbone.js do istniejących elementów i wstawianie el do DOM
Większość kręgosłupa Zobacz przykłady Widzę w Internecie określić tagName, id i/lub className, podczas tworzenia widoku, a tym samym utworzyć el, który jest odłączony od DOM. Zazwyczaj wyglądać mniej więcej tak:
App.MyView = Backbone.View.extend({
tagName: 'li',
initialize: function() {
...
},
render: function() {
$(this.el).html(<render an html template>);
return this;
}
});
Ale ćwiczenia nie zawsze ominąć wyjaśniając, w jaki sposób polecają uzyskanie świadczonych el do DOM. Widziałem to na kilka różnych sposobów. Moje pierwsze pytanie brzmi: gdzie jest odpowiednie miejsce na wywołanie metody renderowania widoku i wstawienie jej do DOM? (niekoniecznie jedno i to samo miejsce). Widziałem to zrobić w routerze, w funkcji inicjowania lub renderowania widoku lub po prostu w funkcji gotowego dokumentu na poziomie katalogu głównego. ($(function()
). Mogę sobie wyobrazić, że któreś z tych prac działa, ale czy jest to właściwy sposób?
Po drugie, zaczynam od jakiegoś znacznika HTML/modelu szkieletowego i konwertowania części html na szablony js odpowiadające widokom szkieletu. Zamiast pozwolić, aby widok renderował nieprzyłączony element i zapewniający punkt zaczepienia w html, aby go włożyć, mam wrażenie, że jest on bardziej naturalny, gdy ma być tylko jeden element dla widoku i nie zniknie, używać istniejącego, opróżnionego elementu opakowania (często div
lub span
) jako samego siebie. W ten sposób nie muszę się martwić o znalezienie miejsca w dokumencie, aby wstawić mój wolné EL, które potencjalnie w końcu wygląda tak (uwaga na dodatkowe warstwowanie):
<div id="insert_the_el_in_here"> <!-- this is all that's in the original HTML doc -->
<div id="the_el"> <!-- i used to be a backbone generated, unattached el but have been rendered and inserted -->
<!-- we're finally getting to some useful stuff in here -->
</div>
</div>
więc częścią mojego drugiego pytania czy dla widoku w zasadzie statycznego jest coś złego w używaniu istniejącego elementu z kodu HTML strony bezpośrednio jako mój widok el
? W ten sposób wiem, że jest już w DOM, we właściwym miejscu, a wywoływanie renderowania natychmiast wyrenderuje widok na stronie. Osiągnę to, przekazując element już istniejący do konstytutu mojego widoku jako "el". W ten sposób wydaje mi się, że nie muszę się martwić o wtrącenie go do DOM (kwestionując 1 kwestię), a wywołanie renderowania natychmiast zaktualizuje DOM. Na przykład.
<form>
<div someOtherStuff>
</div>
<span id="myView">
</span>
</form>
<script type="text/template" id = "myViewContents"> . . . </script>
<script type="application/javascript">
window.MyView = Backbone.View.extend({
initialize: function() {
this.template = _.template($('#myViewContents').html());
this.render();
},
render: function() {
$(this.el).html(this.template());
return this;
}
});
$(function() {
window.myView = new MyView({ el: $('#myView').get(0) });
});
</script>
Czy jest to dobry sposób na wykonanie statycznych widoków na stronie? tj. jest tylko jeden z tych poglądów i nie zniknie w żadnych okolicznościach. Czy jest jakiś lepszy sposób? Rozumiem, że mogą istnieć różne sposoby robienia rzeczy (np. W routerze, w widoku nadrzędnym, wczytywaniu strony itp.) W zależności od tego, jak korzystam z widoku, ale teraz patrzę na początkowe ładowanie strony przypadek użycia.
Dzięki
Dziękuję również za poradę na temat używania wzoru modułu. Flirtowałem z require.js jako sposobem na zaimplementowanie modułów i dynamicznego ładowania oraz wszystkich dobrych rzeczy, ale używamy tylu wtyczek innych niż AMD i istniejącego kodu, który moim zdaniem jest prawdopodobnie prostszy i mniej podatny na błędy. rzeczy w plikach i modułach, które mają sens, użyj czegoś takiego jak wzorzec modułu wskazanego powyżej, jeśli to możliwe, i dołącz/zminij je do produkcji. –
Absolutnie require.js to świetne rozwiązanie, ale z pewnością może być trudne. Zazwyczaj używam tylko wzorców, takich jak wzorzec modułu, a następnie używam przestrzeni nazw, aby zachować rzeczy poza oknem. Cieszę się, że mogłem pomóc! – jcreamer898
Dzięki za wskazanie we właściwym kierunku. Okazało się również, że $ (this.el) nie działa w ten sam sposób. $ El –