Javascript Backbone.js-无法触发集合中的事件
我对JavaScript和主干相当陌生,我遇到了这个错误Javascript Backbone.js-无法触发集合中的事件,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我对JavaScript和主干相当陌生,我遇到了这个错误 Router = Backbone.Router.extend({ routes: { ":albumID": "load" }, load: function (albumID) { if (controller.collectionInitialized == true) { console.log("RESET"); alb
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();
}
});
我收到以下错误:
无法获取未定义或空引用的属性“trigger”
。if
语句确保在触发clear
之前已存在album
。之前,我尝试直接调用相册.reset(),但得到了相同的错误。我猜这是某种范围问题,有人能给我指出正确的方向吗?在Javascript中,变量确实是函数范围的
,这意味着它们在其本地范围(即函数主机)中都是可见的,但实例化是另一回事
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);
}
在调用相册上的方法trigger
后,创建一个新相册
,从而导致空引用
此外,即使调用函数两次(即第一次将controller.collectionInitialized
初始化为false
,第二次调用为true
),由于变量album
是函数的局部变量,因此当您输入if
正文时,它总是未定义的,因为它的作用域是函数load
,所以每次到达load
主体的末尾时,它都会“死亡”
为您的问题提供正确的解决方案:将变量album
定义在一个更高的作用域级别(即作为参数传递给extend
方法的对象级别)controller
是一个有效实例并且存在,并且假设controller.collectionInitialized
设置为true,则基本上是对值为null的变量album
调用方法触发器
使用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
无论您使用哪种机制来启用对控制器的全局访问,请使用相同的方法来启用对相册的全局访问。不要将相册重新声明为函数的本地
多读一些关于这方面的知识可能会有所帮助 但是if语句确保它仅在已创建相册时触发clear
ifalbum
。这没关系吗?@DimaShabatin实际上我是根据我对Javascript的了解来回答的(我还没有使用主干网)。您在哪里定义collectionit
和collectionInitialized
?