我对JavaScript和Backbone相当陌生,遇到了此错误。
Router = Backbone.Router.extend({
routes: {
":albumID": "load"
},
load: function (albumID) {
if (controller.collectionInitialized == true) {
console.log("RESET");
album.trigger("clear");
}
var album = new Album([], {
title: albumID
});
controller.trigger("collectionInit");
controller.trigger("switchAlbum", albumID);
}
});
Controller = Backbone.Model.extend({
currentAlbum: "",
collectionInitialized: false,
initialize: function () {
console.log("controller is initialized");
this.on("switchAlbum", function (newAlbum) {
this.currentAlbum = newAlbum;
});
this.on("collectionInit", function () {
this.collectionInitialized = true;
});
}
});
Album = Backbone.Collection.extend({
initialize: function (models, options) {
this.on("clear", this.clear);
},
clear: function () {
this.reset();
this.off();
}
});
我收到此错误:
Unable to get property 'trigger' of undefined or null reference
。 if
语句可确保在触发album
之前已存在clear
。以前,我尝试直接调用album.reset()
,但遇到相同的错误。我的猜测是这是一种范围界定问题,有人可以指出正确的方向吗? 最佳答案
编辑
重新读取代码,假设controller
是有效实例并且存在,并且假设controller.collectionInitialized
设置为true,则基本上是在变量trigger
上调用方法album
,该变量的值为null。
使用JS提升规则,您的load函数可能被编写为
load: function(albumID) {
var album = null;
if (controller.collectionInitialized == true) {
console.log("RESET");
album.trigger("clear");
}
album = new Album([], { title: albumID });
controller.trigger("collectionInit");
controller.trigger("switchAlbum", albumID);
}
也许,上面的重写清楚地表明,即使
controller.collectionInitialized
是true
,album
也是局部变量,并且每次调用load函数时始终将其重置为null。使用哪种机制来启用对
controller
的全局访问,都可以使用相同的方法来启用对album
的全局访问。不要将album
重新声明为该函数的本地变量。...
可能有助于阅读有关Javascript variable and function hoisting的更多信息。
关于javascript - Backbone.js-无法触发集合中的事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16445626/