我有两个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();
});
答案 0 :(得分:2)
这一切都与功能上下文有关。这是在Javascript中调用函数的方式的常见混淆。
在第一种方式中,您正在处理要调用的函数,但没有定义上下文。这意味着无论谁调用它都将成为“这个”。相当于调用App.collections.movies.fetch()
的等价物可能不是你想要的。至少,我猜这是上下文的意思。很难确切地知道......它可能是jQuery,可能是Backbone.sync
。要告诉的唯一方法是在Backbone.collections.fetch
函数中放置一个断点并打印出this
变量。无论如何,它都不会是你想要的。
在第二种情况下,再次将其设为函数,但在内部,您可以指定调用函数的上下文。在这种情况下,fetch
将以App.collections.theaters
作为上下文进行调用。
......那是清楚的吗?