将事件传递到主干中的集合

时间:2013-05-13 08:45:19

标签: javascript backbone.js

我试图通过在我的应用中的其他位置触发事件来触发集合上的行为。我对骨干很新,所以可能我的所有语法都错了,但这似乎应该可行

fiddle

var Test = Backbone.Model.extend({
});
var Tests = Backbone.Collection.extend({
        model: Test,
        events: {
            "testEvent":"testResponce"
        },
        testResponce: function(){
            alert('hello world');
        }
    });



var myTest = new Test();

myTest.trigger('testEvent');

可以这样做吗?我哪里错了?

2 个答案:

答案 0 :(得分:1)

您正在触发的事件必须被捕获到模型中。

如果您想在集合中捕获事件,可以使用 Backbone.on Backbone.trigger collection.on collection.trigger

请查看以下小提琴中的示例

fiddle

var Test = Backbone.Model.extend({});
var Tests = Backbone.Collection.extend({
    model: Test,
    initialize: function () {
        Backbone.on('testEvent', function () {
            alert('event handled in collection');
        });
    }
});


var myCollection = new Tests();
var myTest = new Test();

Backbone.trigger('testEvent');

<强>更新

集合有一个initialize method,您可以使用它来注册事件。稍后您可以从他们的实例触发这些事件。

建议NULL建议的其他方式如下所示。

var Test = Backbone.Model.extend({});
var Tests = Backbone.Collection.extend({
    model: Test,
    initialize: function () {
        this.on('testEvent', function () {
            alert('event handled in collection');
        });
    }
});


var myCollection = new Tests();
var myTest = new Test();

myCollection.trigger('testEvent');

答案 1 :(得分:1)

如果您想使用testEvent事件调用集合的特定方法,那么您也可以采用此路径。 Working Demo

var Test = Backbone.Model.extend({
    initialize: function() {
        this.on('testEvent', function() {
            console.log(this.collection);
            this.collection.testResponce();
        });
    }
});
var Tests = Backbone.Collection.extend({
        model: Test,
        testResponce: function(){
            alert('hello world');
        }
    });

var myTest = new Test();
var testList = new Tests([myTest]);
myTest.trigger('testEvent');