Переопределить сборку-выборку
Я хочу получить свою коллекцию в режиме NON-RESTful, поэтому я решил переопределить Collection.fetch
с помощью
App.carClc = Backbone.Collection.extend({
model : App.cardModel,
url : 'http://localhost/bbtest/data.php',
fetch : function() {
$.ajax({
type : 'GET',
url : this.url,
success : function(data) {
console.log(data);
}
});
}
});
Я не знаю, как настроить мою коллекцию на ответ. Я новичок в BackboneJS, спасибо всем вам!
Ответы
Ответ 1
Если вы хотите добавить пользовательский "декоратор" к fetch
, но не полностью переопределите его, попробуйте:
var MyCollection = Backbone.Collection.extend({
//custom methods
fetch: function(options) {
//do specific pre-processing
//Call Backbone fetch
return Backbone.Collection.prototype.fetch.call(this, options);
}
});
Здесь вам не нужно выкатывать свой собственный $.ajax
Кроме того, не забудьте return
в последней строке, если вы хотите использовать обещание jQuery, возвращаемое методом Backbone fetch
.
Подробнее см. http://japhr.blogspot.in/2011/10/overriding-url-and-fetch-in-backbonejs.html.
Ответ 2
Базовая коллекция имеет два метода для установки новых данных и reset. Предположим, вы хотите заменить все данные сбора входящими данными и для этого используйте reset:
App.carClc = Backbone.Collection.extend({
model : App.cardModel,
url : 'http://localhost/bbtest/data.php',
fetch : function() {
// store reference for this collection
var collection = this;
$.ajax({
type : 'GET',
url : this.url,
dataType : 'json',
success : function(data) {
console.log(data);
// set collection data (assuming you have retrieved a json object)
collection.reset(data)
}
});
}
})
Ответ 3
Я использую что-то вроде этого:
$.when( $.ajax( URL, { dataType: "json" } ) )
.then( $.proxy( function( response ) {
ctx.view.collection.reset( response );
},ctx ) );
Главное, что я использую collection.reset(data)
для повторной инициализации коллекции
Ответ 4
Если вы хотите сохранить "thenable" для promises, вы также можете сделать что-то вроде этого:
fetch: function() {
var self = this,
deferred = new $.Deferred();
$.get(this.url).done(function(data) {
// parse data
self.reset({parsed data});
deferred.resolve(); //pass in anything you want in promise
});
return deferred.promise();
}
Ответ 5
Если вам нужно сделать это для каждой модели и/или коллекции, переопределите Backbone.ajax
.
Переопределение Backbone.ajax
дает вам запрос options
, который обычно передается на $.ajax
. Вам нужно вернуть ответ $.ajax
(или какой-либо другой Promise
) и не нужно беспокоиться о настройке материала в коллекции/модели.