Javascript Backbone.js-无法触发集合中的事件

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

我对JavaScript和主干相当陌生,我遇到了这个错误

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
if
album
。这没关系吗?@DimaShabatin实际上我是根据我对Javascript的了解来回答的(我还没有使用主干网)。您在哪里定义
collectionit
collectionInitialized