2011-11-21 18 views
10

Właśnie zdałem sobie sprawę, że nie rozumiem atrybutu el z Backbone.View. Zasadniczo moje widoki wymagają atrybutów dynamicznych id na podstawie atrybutu tego modelu. Myślałam, że to działa dobrze, bo po prostu określone w moim szablonu:Widok kręgosłupa z dynamicznym id

<script type="text/template" id="item_template"> 
    <li class="item" id="{{identifier}}"> 
    <span class="name">{{name}}</span> 
    </li> 
</script> 

jednak zdałem sobie sprawę, że to, co zostało faktycznie robi Backbone było wprowadzenie tego skompilowany szablon do innego elementu, div domyślnie. Dowiedziałem się więcej na ten temat, czytając dokumentację, ale wciąż nie mam pojęcia, jak utworzyć dynamiczny model id.

Najlepiej byłoby, gdybym znalazł sposób, aby to, co jest w powyższym szablonie, służyło jako mój el, ponieważ ma już wszystko, czego chcę, ale nie wiem, czy to możliwe. Zastanawiam się, czy po prostu istnieje sposób na określenie atrybutu dynamicznego id.

Próbowałem ustawić go w metodzie initialize, this.id = this.model.get('attr'), ale nie wydaje się, aby miało to jakiś wpływ, prawdopodobnie dlatego, że do tego czasu jest już za późno.

Co mam aktualnie robi się tylko przy użyciu jQuery aby dodać id w trakcie render():

this.el.attr(id: this.model.get('identifier')); 

to działa, ale oczywiście, ja po prostu pytając, czy jest najlepszym sposobem, aby to zrobić przez Szkielet.

Odpowiedz

20

Tak nie jest standardowym sposobem, aby to zrobić w Backbone. Możesz przekazać id do konstruktora widoku. Możesz także refaktoryzować swój szablon, tak aby Szkielet tworzy dla ciebie element rodzica <li>. Spróbuj tego prostszej formy:

<script type="text/template" id="item_template"> 
    <span class="name">{{name}}</span> 
</script> 

I dodać je do widoku:

myView = Backbone.View.extend({ 
    className: "item", 
    tagName: "li" 
}) 

I instancji to tak:

var view = new YourView({ 
    model: mymodel, 
    id: mymodel.get('identifier') // or whatever 
}) 

Powodzenia!

+0

Jeszcze raz dziękuję maxl0rd (pomógł mi w drugim pytaniu: D). Wydaje się, że to powinno działać: D Spróbuję i wrócę, aby oznaczyć jako poprawne :) –

+0

dla tych, którzy nie wiedzą, tagName domyślnie div, jeśli nie jest określony. Będę widział dużą liczbę szablonów, które mają kontener [formularz, div, etc ...z identyfikatorem] i to naprawdę powinno być częścią widoku, a nie szablonem. jak pokazano w odpowiedzi maxl0rd – PDA

1

Podczas tworzenia widoku, przechodzą w przełącznik, który pozwoli widok odnaleźć istniejący pre-renderowane elementu DOM:

var id = "1234"; 
var view = YourView({el: '#'+id}); 
+0

Element nie jest pre-renderowane, a nie jest w DOM o ile wiem. Jest tam tylko jako szablon w tagu skryptu. –

5

Jest jeszcze jedno podejście. Zauważyłem, że jest to wygodniejsze niż przekazywanie id za każdym razem, gdy tworzysz instancję swojego widoku.

Szablon:

<script type="text/template" id="item_template"> 
     <span class="name">{{name}}</span> 
</script> 

Widok:

var MyView = Backbone.View.extend({ 
    tagName: 'li', 
    attributes: function(){ 
     return { 
      id: this.model.get('identifier'), 
      class: 'item'//optionally, you could define it statically like before 
     } 
    } 
}) 
+0

up-vote this answer, ponieważ ma ogólne rozwiązanie zdefiniowane w 'constructor' – Mikhail

Powiązane problemy