Backbone.js 未识别主干自定义事件触发器?

Backbone.js 未识别主干自定义事件触发器?,backbone.js,Backbone.js,我是第一次学习Backbone.js,但在尝试从触发(或从识别触发时间的视图)获取自定义事件时遇到了问题 您可以在这里看到我的收藏代码:初始化时,它会触发一个自定义Collection:init事件 var Contacts = Backbone.Collection.extend({ model: Contact, initialize: function(){ this.trigger('collection:init'); this.bin

我是第一次学习Backbone.js,但在尝试从触发(或从识别触发时间的视图)获取自定义事件时遇到了问题

您可以在这里看到我的收藏代码:初始化时,它会触发一个自定义
Collection:init
事件

var Contacts = Backbone.Collection.extend({
    model: Contact,

    initialize: function(){
        this.trigger('collection:init');
        this.bind('add', this.model_added, this);
    },

    model_added: function(){
        console.log('A new model has been created so trigger an event for the View to update the <select> menu');
    }
});

知道我做错了什么吗?

视图中的事件哈希用于将DOM中的事件绑定到视图,例如渲染视图中的元素引发的事件。要侦听集合引发的事件,您必须手动设置它们:

var ContactsView = Backbone.View.extend({
    initialize: function(){
        contacts.on("collection:init",this.populate,this);
    }
    ...
});
请注意,您使用的是全局联系人变量,我建议使用主干机制并将集合传递给构造函数,就像您使用el:

var ContactsView = Backbone.View.extend({
    initialize: function(){
        console.log(this.collection.models);
        this.collection.on("collection:init",this.populate,this);
    }
    ...
});

var contacts_view = new ContactsView({
    el: $('#view-contacts'),
    collection:contacts
});
正如@mu在注释中所说的,As is,您的事件不会做任何事情,因为您在集合的initialize方法中触发它,因此在您可以绑定视图中的任何内容之前,集合的构造函数会自动调用该方法。查看此小提琴以可视化调用顺序:

在别处触发它,或者,如果我正确理解了您的意图,您(可能)希望使用内置重置事件:

var ContactsView = Backbone.View.extend({
    initialize: function(){
        this.collection.on("reset",this.populate,this);
    }
    ...
});

有关潜在用途的示例,请参见

您好,视图是否通过构造函数接收集合?在initialize方法内部视图期间,您是否订阅了类似以下内容的事件:
this.collection.on(“init”,this.populate)
this.collection.on(“collection:init,this.populate,this”)仍然会有问题,不是吗?在任何东西都可以绑定到该事件之前,集合将始终被初始化(和
“collection:init”
触发)。@mu你完全正确,我不确定如何解释,这就是为什么我添加了关于重置事件的说明。我将编辑我的答案并添加您的评论,不知何故:)我认为您对重置事件的看法是正确的。而且添加的
模型\u
可能也应该在视图中正确。@Integralist这就是Mu和我在前面的评论中讨论的,在initialize方法中触发事件不会让您有任何结果,没有任何东西可以听它,因为initialize是构造函数的一部分。检查我刚才添加的第一把小提琴,看看创建集合时会发生什么。第二把小提琴应该指向潜在解决方案的方向。@Integralist和最后一把小提琴演示一个自定义事件
var ContactsView = Backbone.View.extend({
    initialize: function(){
        this.collection.on("reset",this.populate,this);
    }
    ...
});