我是 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();
}
});
我收到此错误:无法获取未定义或空引用的属性“触发器”
。 if
语句确保 album
在触发 clear
之前已经存在。以前我尝试直接调用 album.reset()
但得到了同样的错误。我的猜测是这是某种范围界定问题,有人可以为我指出正确的方向吗?
最佳答案
编辑
重新阅读代码,假设 controller
是一个有效的实例并且存在,并且假设 controller.collectionInitialized
设置为 true,您基本上是在调用一个方法trigger
变量 album
的值为 null。
使用 JS 提升规则,你的加载函数可以写成
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/