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 BackboneJS从初始加载添加捕获事件_Javascript_Backbone.js_Backbone Events_Backbone Relational - Fatal编程技术网

Javascript BackboneJS从初始加载添加捕获事件

Javascript BackboneJS从初始加载添加捕获事件,javascript,backbone.js,backbone-events,backbone-relational,Javascript,Backbone.js,Backbone Events,Backbone Relational,我正在创建一个集合,但没有使用fetch(),但JSON数据已经可用 this.displays = new Displays(jQuery.parseJSON($('#temp_json').html())); 我需要为该集合的每个模型设置一个“位置”值,该值应为该模型在此集合中的位置 我要做的是捕获一个事件,在初始加载中,每个模型都是从JSON构建的,并添加到集合中 然后,我将制作如下内容: theModel.set('position', this.length); 不幸的是,我找不到

我正在创建一个集合,但没有使用fetch(),但JSON数据已经可用

this.displays = new Displays(jQuery.parseJSON($('#temp_json').html()));
我需要为该集合的每个模型设置一个“位置”值,该值应为该模型在此集合中的位置

我要做的是捕获一个事件,在初始加载中,每个模型都是从JSON构建的,并添加到集合中

然后,我将制作如下内容:

theModel.set('position', this.length);
不幸的是,我找不到应该将我的收藏绑定到的事件。 此外,此集合的模型还包含其他集合(…),应该在这些集合中执行相同的操作

这可能看起来很奇怪,但我必须这样做,因为在我看来,稍后我将讨论以下内容:

var prototypeNames = [this.model.get('display').get('position'), this.model.get('position')];
希望这足够清楚。
谢谢

Collection.add-函数触发一个
add
-事件,您可以使用
on
-函数收听该事件。事件将添加的模型和包含一些有用属性(如添加模型的索引)的选项对象作为参数传递。()

所以你可以这样做:

collection.on('add', function(model, options) {
  model.set('position', options.index); 
});
如果您想了解有关
add
-事件传递的参数的更多信息,只需记录它们,因为现有文档充其量也不多

collection.on('add', function(model, options) {
  console.log(options); 
});

希望这有帮助

适合我的解决方案:

我使用了BackbonRelational,这在处理实际的模型关系时非常棒。 我正在听“relational:add”,它在构建集合时为集合的每个项触发

然后,我在我的项目上设置一些值,并触发一个新的事件“postAdd”,可以从我的视图中听到它

window.Displays  = Backbone.Collection.extend({
    model: Display,
    initialize: function(data, options){
        this.on("relational:add", function(relModel){
            relModel.set('pos',this.indexOf(relModel));
            this.trigger('postAdd', relModel);
        }, this);
    },

});

您可以覆盖集合的默认“添加”实现,以触发一个自定义事件,该事件不会被主干网静音

var MyCollection = Backbone.Collection.extend({

  // Override the default 'add' implementation...
  add: function( models, options ) {

    // Call the default implementation first...
    Backbone.Collection.prototype.add.apply( this, arguments );

    // Fire our custom events on the models...
    while (model = models.shift()) {
      model.trigger('customAdd', model, this, options);
    }

    return this;
  }

});
现在,您可以收听在模型上触发的“customAdd”事件。当静默=真时,此事件将始终被触发

因此,当添加带有{silent:false}的项时,将触发两个事件:“add”和“customAdd”


我使用这种技术在新集合初始加载并创建所有模型时触发事件。由于initialize方法将在创建模型之前调用,因此我需要重写“reset”函数,以在创建模型时触发要执行的代码。

如果我没有弄错,则在构建集合时,如果集合包含多个项,则不会触发此事件。所以onLoad这不是我所需要的触发。