Backbone.js:未捕获TypeError:Object#<object>没有方法'get'</object>

时间:2012-09-29 18:27:00

标签: javascript jquery backbone.js

您好我有一个使用fetch()从API进行初始提取的集合。在用户的互动中,会触发第二次抓取,但不是使用原始fetch(),而是使用我自己定义的fetchNew()

集合

ListingCollection = Backbone.Collection.extend({
    model: Listing,
    url: '/api/search_by_bounds',

    fetchNew: function(options) {
        options = options || {};
        var collection = this,
            success = options.success;
        options.success = function(resp, status, xhr) {
            _(collection.parse(resp, xhr)).each(function(item) {
                // added this conditional block
                if (!collection.get(item.id)) {
                    // Update collection
                    collection.add(item, {silent:true});
                    // Render View
                    new ListingMarkerView({ model:item }).render();
                }
            });
            if (!options.silent) {
                collection.trigger('reset', collection, options);
            }
            if (success) success(collection, resp);
        };
        return (this.sync || Backbone.sync).call(this, 'read', this, options);
    }
});

这将仅将新模型添加到集合中,并仅渲染这些新模型的视图。 (如果删除并重新渲染所有视图,则会导致闪烁)

查看

ListingMarkerView = Backbone.View.extend({

    render: function() {
        var marker = L.marker([this.model.get('lat'), this.model.get('lng')]);
        markers.addLayer(marker);
    },

    close: function() {
        this.unbind;
    }

});

错误

但是我收到了错误:

Uncaught TypeError: Object #<Object> has no method 'get' 

对应ListingMarkerView

中的这一行
var marker = L.marker([this.model.get('lat'), this.model.get('lng')]);

调试

如果我在呈现console.log(item)

的行之前放置ListingMarkerView
console.log(item)
new ListingMarkerView({ model:item }).render();

我确实看到有效的item

Object
    id: "2599084"
    lat: "42.276852"
    lng: "-71.165421"
    price: "2850"
    __proto__: Object

因此...

问题

似乎有什么问题?怎么解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:6)

问题是呈现没有正确定义this。 在视图类中添加initialize方法,如下所示:

initialize: function() {
   _.bindAll(this); //Make all methods in this class have `this` bound to this class
}