从嵌套函数调用访问Backbone查看此内容

时间:2014-07-02 10:54:44

标签: javascript backbone.js leaflet

我正在尝试执行以下操作:

Backbone.View.extend({
    ...

    onEachFeature: function (feature, layer) {
        // "this" should be the view but is
        // the function like normally in closures
        this.doSomething();
    },

    geoJsonSynced: function () {
        this.geojson = L.geoJson(
            this.collection.geojson(),
            {
                onEachFeature: this.onEachFeature
            }
        );  
    }


    ...

});

我认为这是一个不同的情况,因为onEachFeature是一个视图的属性,但显然不是这里的情况。我想不出有办法正确地做到这一点。通常使用闭包我只做var = this,但在这种情况下我无法将“那”放入范围。

我试图通过以下方式将其纳入范围:

geoJsonSynced: function () {
    var that = this;
    this.geojson = L.geoJson(
        this.collection.geojson(),
        {
            onEachFeature: this.onEachFeature
        }
    );  
}

我想我做错了。

目前我正在以一种非常糟糕的方式(通过我自己的观点)通过拥有一个全局变量并在onEachFeature中执行以下操作来实现它:

onEachFeature: function (feature, layer) {
    var view = globalVariable.someView;
    view.doSomething(); 
}

有更好的方法吗?

编辑: 它比我想象的更容易修复:

geoJsonSynced: function () {
    var onEachFeature = _.bind(this.onEachFeature, this);
    this.geojson = L.geoJson(
        this.collection.geojson(),
        {
            onEachFeature: onEachFeature
        }
    );  
}

谢谢代码运行者。

2 个答案:

答案 0 :(得分:1)

尝试使用_.bindall(),我们会非常清楚地讨论同样的问题here

答案 1 :(得分:1)

以下是使用jquery

进行相同操作的方法
geoJsonSynced: function () {
        this.geojson = L.geoJson(
            this.collection.geojson(),
            {
                onEachFeature: $.proxy(this.onEachFeature,this)
            }
        );  
    }

文档 - http://api.jquery.com/jquery.proxy/