如果我覆盖'fetch',我如何填充骨干模型?

时间:2012-11-05 00:36:41

标签: backbone.js google-places-api

我正在构建一些JS来使用骨干网访问谷歌JS API。到目前为止,我真的坚持使用模型绑定。

我覆盖'fetch'以便能够使用Google API。对Google的调用工作正常。

var Places = Backbone.Collection.extend({
    model: Place,

    fetch: function(options) {
        // SNIPPET //

        service = new google.maps.places.PlacesService(map);
        service.nearbySearch(request, this.googlePlaceCallback);

        // SNIPPET //
    },

    parse: function(response){
        // nerver  called
    },

    googlePlaceCallback: function(results, status) {
        // I do something here and is properly called after Google returns a response
    }

});

我还定义了一个非常简单的视图:

var MapView = Backbone.View.extend({

    initialize: function() {
        this.model = new Places();
        this.model.bind("reset", this.render, this);
        this.model.fetch();
    },

    render : function () {
        console.log( this.model.toJSON() );
    }

});

我无法弄清楚如何填充'模型'。 Google会返回预期结果,但我可以将它们设置为骨干模型。我在“googlePlaceCallback”中需要做些什么吗?我可能还需要覆盖'解析',因为Google的结果并不是很有趣。

1 个答案:

答案 0 :(得分:2)

假设结果是您想要的结果的集合,您应该能够按如下方式实现回调:

googlePlaceCallback: function(results, status) {
    this.add(results);
}

由于Places是一个主干集合,您只需在上面的代码中调用以下方法:http://backbonejs.org/#Collection-add

您还必须在googlePlaceCallback函数中获取正确的this引用(您希望this成为集合)。一种方法是使用Underscores bindAll方法(http://underscorejs.org/#bindAll),您可以使用它来确保Backbone类中的所有方法都具有Collection本身的this上下文。您可以在初始化时执行以下操作:

initialize: function() {
    _.bindAll(this);
}

另外,没有调用解析的原因是因为你要重写fetch,而fetch调用就是解析。如果您查看带注释的骨干代码,您将能够看到方法调用:http://backbonejs.org/docs/backbone.html