Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将事件传递给主干中的集合_Javascript_Backbone.js - Fatal编程技术网

Javascript 将事件传递给主干中的集合

Javascript 将事件传递给主干中的集合,javascript,backbone.js,Javascript,Backbone.js,我试图通过在我的应用程序的其他地方触发事件来触发集合的行为。我对主干网还很陌生,所以可能我所有的语法都错了,但这似乎应该是可行的 这能做到吗?我哪里出错了?您触发的事件必须在模型内部捕获 如果要捕获集合内的事件,可以使用主干.on和主干.trigger或集合.on和集合.trigger 请查看下面的提琴以了解示例 更新 集合具有可用于在其上注册事件的。稍后,您可以从它们的实例触发这些事件 建议的另一种方法是如下所示 var Test = Backbone.Model.extend({});

我试图通过在我的应用程序的其他地方触发事件来触发集合的行为。我对主干网还很陌生,所以可能我所有的语法都错了,但这似乎应该是可行的


这能做到吗?我哪里出错了?

您触发的事件必须在模型内部捕获

如果要捕获集合内的事件,可以使用主干.on主干.trigger集合.on集合.trigger

请查看下面的提琴以了解示例

更新

集合具有可用于在其上注册事件的。稍后,您可以从它们的实例触发这些事件

建议的另一种方法是如下所示

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');

如果要使用
testEvent
事件调用集合的特定方法,则也可以使用此路径


我不建议通过全局名称空间来路由事件。使用
this.on
this.trigger
来引用
Backbone.Collection的一个实例。这确实回答了这个问题,因此是一个有价值的勾号接收者。然而,向前看,我实际上打算从事件实例化一个模型,所以这将创建一个循环?!我想我可以创建两个模型类,一个用于触发,一个用于实际数据存储,但是,当我真正想要的只是触发器方法并且不污染全局名称空间时,拥有一个完整的主干模型,这让我觉得太过分了。如果您想在
testEvent
事件的触发器上创建另一个模型,那么您可以轻松地在
testResponse
方法中创建一个新模型,并将其添加到您的集合中。根本没有循环。可能有一个用例,在此基础上,你已经提出了这个问题,所以请让我知道它是如何涉及循环的。啊,我明白了,对不起,误解了代码。但是会有重复的事件绑定,不会吗?@MildFuzz不会有重复的事件绑定。每个模型都在侦听一个事件
testEvent
,该事件在模型本身上被触发。在事件处理程序中,由您决定要做什么。在本例中,我们调用的是一种完全正确的收集方法。在本例中,我们定义了一个匿名方法作为事件处理程序
testresponse
只是另一个方法,不是事件处理程序,而是从匿名事件处理程序调用的。也许你可以向我解释一下你是如何看到重复的事件绑定的,这样我才能更好地回答你的问题。在这个提琴中,模型上没有绑定,但是集合上有绑定,这是你想要的。已经有一个集合对象与每个模型关联,我们只是在集合上触发一个事件。现在只有一个事件绑定,它仅在集合上。模型上没有绑定。
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');
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');
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');