覆盖Backbone的Collection-fetch

时间:2012-11-13 09:45:47

标签: javascript backbone.js web

我希望以非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的新手,谢谢大家!

5 个答案:

答案 0 :(得分:57)

如果您要向fetch添加自定义“装饰器”,但不能完全覆盖它,请尝试:

    var MyCollection = Backbone.Collection.extend({

        //custom methods

        fetch: function(options) {

            //do specific pre-processing 

            //Call Backbone's fetch
            return Backbone.Collection.prototype.fetch.call(this, options);
        }

  });    

在这里,您不必推出自己的$.ajax

另外,如果要使用Backbone的return方法返回的jQuery保证,请不要忘记最后一行中的fetch

有关详细信息,请参阅http://japhr.blogspot.in/2011/10/overriding-url-and-fetch-in-backbonejs.html

答案 1 :(得分:30)

Backbone集合有两种方法来设置新数据的添加和重置。假设您想要使用传入数据替换所有收集数据,因此使用重置:

 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)
        }
    });
}
})

答案 2 :(得分:3)

我正在使用这样的东西:

$.when( $.ajax( URL, { dataType: "json" } ) )
    .then( $.proxy( function( response ) {
            ctx.view.collection.reset( response );                              
    },ctx ) );

我使用collection.reset(data)重新初始化集合的主要观点

答案 3 :(得分:2)

如果您想继续获取承诺“可以”,那么您也可以这样做:

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();
}

答案 4 :(得分:0)

如果您需要为每个模型和/或集合执行此操作,请覆盖Backbone.ajax

覆盖Backbone.ajax会为您提供通常传递给options的请求$.ajax。您只需要返回$.ajax(或其他Promise)的响应,而无需担心在集合/模型中设置内容。