Pobieranie kolekcji szkieletowej z parametrami wyszukiwania
Chciałbym zaimplementować stronę wyszukiwania używając Backbone.js
. Parametry wyszukiwania są pobierane z prostego formularza, a serwer wie, aby przeanalizować parametry zapytania i zwrócić tablicę wyników json. Mój model wygląda mniej więcej tak:
App.Models.SearchResult = Backbone.Model.extend({
urlRoot: '/search'
});
App.Collections.SearchResults = Backbone.Collection.extend({
model: App.Models.SearchResult
});
var results = new App.Collections.SearchResults();
Chciałbym, aby za każdym razem, gdy wykonam results.fetch()
, zawartość formularza wyszukiwania będzie również serializowana za pomocą GET
request. Czy jest prosty sposób, aby to dodać, czy robię to źle i prawdopodobnie powinienem zakodować żądanie i tworzenie kolekcji ze zwracanych wyników:
$.getJSON('/search', { /* search params */ }, function(resp){
// resp is a list of JSON data [ { id: .., name: .. }, { id: .., name: .. }, .... ]
var results = new App.Collections.SearchResults(resp);
// update views, etc.
});
Myśli?
4 answers
Kręgosłup.js fetch z parametrami odpowiada na większość twoich pytań, ale kilka też tu umieszczam.
Dodaj parametr data
do wywołania fetch
, przykład:
var search_params = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3',
...
'keyN': 'valueN',
};
App.Collections.SearchResults.fetch({data: $.param(search_params)});
Teraz twój adres URL połączenia ma dodane parametry, które możesz przeanalizować po stronie serwera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:09
uwaga: kod uproszczony i nie testowany
Myślę, że powinieneś podzielić funkcjonalność:
Model Wyszukiwania
Jest to właściwyzasób po stronie serwera. Jedyną dozwoloną czynnością jest CREATE
.
var Search = Backbone.Model.extend({
url: "/search",
initialize: function(){
this.results = new Results( this.get( "results" ) );
this.trigger( "search:ready", this );
}
});
Zbiór Wyników
Jest tylko odpowiedzialny za zbieranie listy modeli wyników
var Results = Backbone.Collection.extend({
model: Result
});
Formularz Wyszukiwania
Widzisz, że ten widok czyni inteligentną pracę, słuchając form.submit
, utworzenie nowego obiektu Search
i wysłanie go do serwera jako created
. Ta misja created
nie oznacza, że Wyszukiwanie musi być przechowywane w bazie danych, jest to normalne zachowanie creation
, ale nie zawsze musi tak być. W naszym przypadku create
Wyszukiwanie oznacza przeszukiwanie DB w poszukiwaniu konkretnych rejestrów.
var SearchView = Backbone.View.extend({
events: {
"submit form" : "createSearch"
},
createSearch: function(){
// You can use things like this
// http://stackoverflow.com/questions/1184624/convert-form-data-to-js-object-with-jquery
// to authomat this process
var search = new Search({
field_1: this.$el.find( "input.field_1" ).val(),
field_2: this.$el.find( "input.field_2" ).val(),
});
// You can listen to the "search:ready" event
search.on( "search:ready", this.renderResults, this )
// this is when a POST request is sent to the server
// to the URL `/search` with all the search information packaged
search.save();
},
renderResults: function( search ){
// use search.results to render the results on your own way
}
});
Myślę, że tego typu rozwiązanie jest bardzo czyste, eleganckie, intuicyjne i bardzo rozszerzalne.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 03:07:48
Znaleziono bardzo proste rozwiązanie-nadpisanie funkcji url()
w zbiorze:
App.Collections.SearchResults = Backbone.Collection.extend({
urlRoot: '/search',
url: function() {
// send the url along with the serialized query params
return this.urlRoot + "?" + $("#search-form").formSerialize();
}
});
Mam nadzieję, że to nie przeraża nikogo, kto ma trochę więcej umiejętności kręgosłupa / Javascript niż ja.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 10:33:40
Wydaje się, że obecna wersja Backbone (a może jQuery) automatycznie stringuje wartość data
, więc nie ma już potrzeby wywoływania $.param
.
Następujące linie dają ten sam wynik:
collection.fetch({data: {filter:'abc', page:1}});
collection.fetch({data: $.param({filter:'abc', page:1})});
Querystring będzie filter=abc&page=1
.
EDIT: to powinien być komentarz, a nie ODPOWIEDŹ.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 00:21:22