2014-02-04 2 views
0

Следующий код работает в Backbone с закодированных данных с использованием POST для извлечения данныхBackbone POST в формате JSON вместо GET

var FullTextSearch = Backbone.Collection.extend({ 
    url: '/fulltextsearch' 
}); 

var SearchResultsListView = Backbone.View.extend({ 
    el: '.page', 
    render: function() { 
    var that = this; 
    var searchResults = new FullTextSearch(); 
    searchResults.fetch({ 
     type: "post", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: '{ "searchtext": "abc" }', 
     success: function (searchResults) { 
     var template = _.template($('#search-results-list-template').html(), {searchResults: searchResults.models}); 
     that.$el.html(template); 
     } 
    }) 
    } 
}); 

Теперь задача состоит в том, чтобы передать данные как JSON полезной нагрузки от формы поиска. Я пробовал что-то подобное без успеха, не пытался загрузить его из формы поиска, хотя это моя конечная цель, поэтому, если есть решение для этого, это даже лучше!

<script type="text/template" id="search-results-list-template"> 
    <form class="search-form"> 
     <input type="text" name="searchtext"> 
     <input type="submit" class="btn" value="Search"> 
    </form> 
... rest of HTML template here... 
</script> 

var SearchPayload = Backbone.Model.extend({ 
    initialize: function(){ 
    console.log("SearchPayload init"); 
    } 
}); 

var FullTextSearch = Backbone.Collection.extend({ 
    url: '/fulltextsearch' 
}); 

var SearchResultsListView = Backbone.View.extend({ 
    el: '.page', 
    events: { 
    'submit .search-form': 'search' 
    }, 
    search: function(ev) { 
    //This is not working yet 
    var searchPayload = $(ev.currentTarget).serializeObject(); 
    console.log("search form clicked, " + searchText); 
    return false; 
    }, 
    render: function() { 
    var that = this; 
    var searchResults = new FullTextSearch(); 
    var searchPayload = new SearchPayload({searchtext: "*"}); 
    searchResults.fetch({ 
     type: "post", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: that.searchPayload, 
     success: function (searchResults) { 
     var template = _.template($('#search-results-list-template').html(), {searchResults: searchResults.models}); 
     that.$el.html(template); 
     } 
    }) 
    } 
}); 

запрос POST не быть установлен правильно, вот что я вижу в отладчике, полезная нагрузка JSON не является частью запроса

Request URL:http://localhost:1234/fulltextsearch 
Request Method:POST 
Status Code:400 Bad Request 
Request Headersview source 
Accept:application/json, text/javascript, */*; q=0.01 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
Content-Length:0 
Content-Type:application/json; charset=utf-8 
Cookie: AJS.conglomerate.cookie="" 
Host:localhost:1234 
Origin:http://localhost:1234 
Referer:http://localhost:1234/index.html?searchtext=abc 
User-Agent:Mozilla/5.0 (Macintosh;Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36 
X-Requested-With:XMLHttpRequest 
Response Headersview source 
Content-Length:40 
Content-Type:text/plain; charset=UTF-8 
Date:Tue, 04 Feb 2014 23:29:46 GMT 
Server:spray-can/1.2.0 

ОТВЕТ Основываясь на этом post, Я получил его как таковой

<script type="text/template" id="search-results-list-template"> 
    <form class="search-form"> 
     <input type="text" name="searchtext"> 
     <input type="submit" class="btn" value="Search"> 
    </form> 
... rest of HTML template here... 
</script> 

var SearchPayload = Backbone.Model.extend({ 
    initialize: function(){ 
    console.log("SearchPayload init"); 
    } 
}); 

var FullTextSearch = Backbone.Collection.extend({ 
    url: '/fulltextsearch' 
}); 

var SearchResultsListView = Backbone.View.extend({ 
    el: '.page', 
    events: { 
    'submit .search-form': 'search' 
    }, 
    search: function(ev) { 
    //This is not working yet 
    var searchPayload = $(ev.currentTarget).serializeObject(); 
    console.log("search form clicked, " + searchText); 
    return false; 
    }, 
    render: function() { 
    var that = this; 
    var searchResults = new FullTextSearch(); 
    var searchPayload = JSON.stringify(new SearchPayload()); 
    searchResults.fetch({ 
     type: "post", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     data: searchPayload, 
     success: function (searchResults) { 
     var template = _.template($('#search-results-list-template').html(), {searchResults: searchResults.models}); 
     that.$el.html(template); 
     } 
    }) 
    } 
}); 

ответ

0

Согласно источнику, Backbone.sync (вызванный выборкой) использует данные от option.attrs or the model itself. Вероятно, лучше всего сделать этот вызов самостоятельно, вне базовой линии, а затем заполнить коллекцию результатами, в этом нет смысла использовать выборку.

+0

Я хотел бы сохранить семантику выборки(), но как POST, и я получил это работает. – Bob

0

Я думаю, что вы ищете Backbone.emulateJSON

+1

На самом деле мне нужен JSON.stringify() – Bob

+0

aah ... хорошо, что у вас есть ответ. , вероятно, вы должны отредактировать свой вопрос с ответом – dsymquen

+0

Я уже сделал :) – Bob

Смежные вопросы