将collection.fetch作为命名函数传递给collection.bind不起作用

时间:2011-11-02 18:16:48

标签: javascript backbone.js

我有两个Backbone集合。我想绑定到重置事件一个。当该事件被触发时,我想在第二个集合上调用fetch,如下所示:

App.collections.movies.bind("reset", App.collections.theaters.fetch);

第二次获取永远不会开火。但是,如果我传递一个调用theaters.fetch的匿名函数,它就没有问题:

App.collections.movies.bind("reset", function () { App.collections.theaters.fetch(); });

知道为什么会这样吗?

继承我的完整代码。我没有展示任何模型或集合,因为它是很多代码,但如果您认为这可能是问题的根源,请告诉我:

var App = {

    init: function () {
        App.collections.theaters = new App.Theaters();
        App.collections.movies = new App.Movies();

        App.events.bind();
        App.events.fetch();

    },

    events: {
        bind: function () {
            App.collections.theaters.bind("reset", App.theaterManager.assign);

            App.collections.movies.bind("reset", function () { App.collections.theaters.fetch(); });
        },

        fetch: function () {
            App.collections.movies.fetch();
        }
    },

    collections: {},

    views: {},

    theaterManager: {

        // Provide each model that requires theaters with the right data
        assign: function () {
            // Get all theaters associated with each theater
            App.theaterManager.addToCollection("theaters");

            // Get all theaters associated with each movie
            App.theaterManager.addToCollection("movies");
        },

        // Add theaters to a collection
        addToCollection: function (collection) {
            App.collections[collection].each(function (item) {
                item.theaters = App.theaterManager.getTheaters(item.get(("theaters")));
            });
        },

        // Returns a collection of Theaters models based on a list of ids
        getTheaters: function () {
            var args;

            if (!arguments) {
                return [];
            }

            if (_.isArray(arguments[0])) {
                args = arguments[0];
            } else {
                args = Array.prototype.slice.call(arguments);
            }

            return new App.Theaters(_.map(args, function (id) {
                return App.collections.theaters.get(id);
            }));
        }
    }
};

$(function () {
    App.init();
});

1 个答案:

答案 0 :(得分:2)

这一切都与功能上下文有关。这是在Javascript中调用函数的方式的常见混淆。

在第一种方式中,您正在处理要调用的函数,但没有定义上下文。这意味着无论谁调用它都将成为“这个”。相当于调用App.collections.movies.fetch()的等价物可能不是你想要的。至少,我猜这是上下文的意思。很难确切地知道......它可能是jQuery,可能是Backbone.sync。要告诉的唯一方法是在Backbone.collections.fetch函数中放置一个断点并打印出this变量。无论如何,它都不会是你想要的。

在第二种情况下,再次将其设为函数,但在内部,您可以指定调用函数的上下文。在这种情况下,fetch将以App.collections.theaters作为上下文进行调用。

......那是清楚的吗?