Backbone模型/集合中的Javascript范围问题

时间:2014-10-31 02:14:20

标签: javascript backbone.js scope marionette

我正在使用树形结构,所以每当我想从树叶到树干的路上工作时,我都需要做一些非常好的发现,但我基本上都想创建一个我能通过的函数函数和应用/调用/绑定/原始上下文的东西,以便我可以看到我原来的变量。解释会很棒。

layerListView = Backbone.Marionette.CollectionView.extend({    
    updateSelectedModelsInTree: function () {
        var col = myApp.request('someOtherCollection');
        this.collection.startFromLeaves(function (m) {
            this.updateSelected(m);
            // col is undefined in here
        }, this);
    }
});
layerCollection = Backbone.Collection.extend({
    startFromLeaves: function (doToModel, context) {
        if (!this.models) return;
        for (var i = this.models.length - 1; i >= 0; i--) {
            var model = this.models[i],
                tag = this.models[i].get('tag');
            if (tag == 'branch') this.startFromLeaves(arguments);
            doToModel.call(context, model);
        }
    }
});

所以我被困在这里,而我想做的就是能够在传递给startFromLeaves的top函数中看到col变量。我不知道如何使用call / bind / apply,但我猜测我的上下文是什么让一切都失去了。

1 个答案:

答案 0 :(得分:0)

查看underscore.js

上的绑定功能

这允许您传递具有此上下文集的函数。所以例如你可以做

updateSelectedModelsInTree: function () {
    var col = myApp.request('someOtherCollection');
    this.collection.startFromLeaves(_.bind(function (m) {
        this.updateSelected(m);
        // col is undefined in here
    }, this));
}

"这"你的功能内部现在将永远是"这个"包含" updateSelectedModelsInTree"