我对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 referenceif语句可确保在触发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.collectionInitializedtruealbum也是局部变量,并且每次调用load函数时始终将其重置为null。

使用哪种机制来启用对controller的全局访问,都可以使用相同的方法来启用对album的全局访问。不要将album重新声明为该函数的本地变量。

...

可能有助于阅读有关Javascript variable and function hoisting的更多信息。

关于javascript - Backbone.js-无法触发集合中的事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16445626/

10-12 12:33