1

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

我覆盖了“获取”以使用 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
    }

});

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

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

});

我不知道如何填充“模型”。谷歌返回预期结果,但我可以将它们设置为骨干模型。我需要在“googlePlaceCallback”中做些什么?我可能还需要覆盖“解析”,因为谷歌结果并不是很有趣。

4

1 回答 1

2

假设 results 是您想要的结果的集合,您应该能够实现回调,如下所示:

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

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

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

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

此外,没有调用 parse 的原因是因为您正在覆盖 fetch,并且 fetch 调用 parse。如果您查看带注释的主干代码,您将能够看到方法调用:http ://backbonejs.org/docs/backbone.html

于 2012-11-05T01:17:26.553 回答