Подтвердить что ты не робот

Переопределить сборку-выборку

Я хочу получить свою коллекцию в режиме 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, спасибо всем вам!

4b9b3361

Ответ 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) и не нужно беспокоиться о настройке материала в коллекции/модели.