Hej
Co prawda nie jest to do końca forum JS, ale na pewno wiele osób ogarnia w stopniu co najmniej dobrym Backbone.js więc postanowiłem się spytać.
Mam taki widok (Handlebars + Haml; werja beta :P):
[code=ruby]%script#sentences_hb{:type => “text/x-handlebars-template”}
= form_tag search_sentences_url, :method => :get, :id => “search-sentences” do
= select_tag :authority_name, {}, class: 'authority-name'
= select_tag :authority_detail_1, {}, class: 'authority-detail-1'
= select_tag :authority_detail_2, {}, class: 'authority-detail-2'
= submit_tag "Submit"
{{sentences.length}}
{{#each sentences.models}}
%p {{attributes.authority_name}} {{attributes.authority_detail_1}} {{attributes.authority_detail_2}}
{{/each}}[/code]
Handlebars ma identyczną skłądnie jak Mustache (tak na marginesie).
Mam obecnie napisane w backbone.js coś takiego że przy każdej zmianie select’a
events:
'change .authority-name': 'getAuthorityDetail1'
'change .authority-detail-1': 'getAuthorityDetail2'
'change .authority-detail-2': 'getSentences'
np na zmianie :authority_name idzie request do Aplikacji. Pobierane jest kolekcja i zwracana w JSON’ie
Następnie po tym aktualizowany jest select .authority-detail-1 (dodaje wartości poprzez Jquery.append() ), i jeśli zmieni się wartość na
authority-detail-1 to znowu idzie request i pobierana jest wartość i dodawana.
Na ostatnim select’cie .authority-detail-2 po zakończonym sukcesem fetch(), Wywołuje callback’a w którym nakazuje z-renderowanie widoku z pobraną kolekcją.
Coś w stylu:
fetchSentences: (authority_name, authority_detail_1, authority_detail_2, callback) =>
this.fetch
url: this.url + "/search?" + authority_name.serialize() + "&" + authority_detail_1.serialize() + "&" + authority_detail_2.serialize()
success: ->
callback() if callback and typeof (callback) is "function"
Cały mechanizm działa w skrócie tak że dodaje pobrane wartości z serwera poprzez jQuery.append() do selektów. Jednak jak gdy wyrenderowuje template’a to wtedy stracę zaznaczone wartości selekta.
Tutaj pojawia się moje pytanie (głównie odnośnie tego które wyjście jest jak najbardziej zgodne z ‘backbone way’).
- Dodawanie wartości poprzez jQuery.append() i zapamiętywanie opcji selektów w zmiennych instancji ( np @authority_name_select)
- Narobienie mnóstwo modeli np AuthorityName, AuthorityDetail1 itd i skorzystanie z nich w odpowiednich kolekcjach.
- [ Tutaj wpisz inną lepsza alternatywę która mi nie przychodzi do głowy ].
Czy jest jakieś zgrabniejsze obejście asynchroniczności fetch’a niż zabawa z callbackiem? Chodzi mi o to że chce po zakończonym sukcesem requescie wykonać parę akcji.