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
Backbone.js 主干集合添加事件触发一次_Backbone.js_Backbone Events - Fatal编程技术网

Backbone.js 主干集合添加事件触发一次

Backbone.js 主干集合添加事件触发一次,backbone.js,backbone-events,Backbone.js,Backbone Events,我有一个主干集合,当我向其中添加一个新模型时,add事件似乎不像我预期的那样工作。我已经绑定了两个视图来侦听集合上的添加事件,但似乎只有一个视图收到了事件通知,并且当发生这种情况时,不会向我的服务器发送PUT请求。当我移除第二个绑定时,另一个绑定工作并发送PUT请求。以下是代码片段: var FlagList = Backbone.Collection.extend({ model: Flag // model not shown here... let me know if

我有一个主干集合,当我向其中添加一个新模型时,add事件似乎不像我预期的那样工作。我已经绑定了两个视图来侦听集合上的添加事件,但似乎只有一个视图收到了事件通知,并且当发生这种情况时,不会向我的服务器发送PUT请求。当我移除第二个绑定时,另一个绑定工作并发送PUT请求。以下是代码片段:

    var FlagList = Backbone.Collection.extend({
    model: Flag  // model not shown here... let me know if it would help to see
});

    var FlagCollectionView = Backbone.View.extend({
    el: $('ul.#flags'),
    initialize: function() {
        flags.bind('add', this.addFlag, this);  // this one doesn't fire!!
    },
    addFlag: function(flag) {
        alert("got it 1");  // I never see this popup
    }
});

    var AddFlagView = Backbone.View.extend({
    el: $("#addFlagPopup"),
    events: {
        "click #addFlag": "addFlag"
    },
            initialize: function() {
                    flags.bind('add', this.closePopup, this);   // this one fires!!
            }
    addFlag: function() {
        flags.create(new Flag);
    },
    closePopup: function() {
        alert("got it 2");  // I see this popup
    }
});

var flags = new FlagList;
var addFlagView = new AddFlagView;
var flagCollectionView = new FlagCollectionView;

此代码适用于我:

var FlagList = Backbone.Collection.extend({});

var FlagCollectionView = Backbone.View.extend({
  initialize: function() {
    flags.bind('add', this.addFlag, this); 
  },
  addFlag: function(flag) {
      alert("got it 1");
  }
});

var AddFlagView = Backbone.View.extend({
  initialize: function() {
    flags.bind('add', this.closePopup, this);
  },
  closePopup: function() {
    alert("got it 2");
  }
});

var flags = new FlagList;
var addFlagView = new AddFlagView;
var flagCollectionView = new FlagCollectionView;

flags.add({key:"value"});

您的问题在其他地方。

此代码适用于我:

var FlagList = Backbone.Collection.extend({});

var FlagCollectionView = Backbone.View.extend({
  initialize: function() {
    flags.bind('add', this.addFlag, this); 
  },
  addFlag: function(flag) {
      alert("got it 1");
  }
});

var AddFlagView = Backbone.View.extend({
  initialize: function() {
    flags.bind('add', this.closePopup, this);
  },
  closePopup: function() {
    alert("got it 2");
  }
});

var flags = new FlagList;
var addFlagView = new AddFlagView;
var flagCollectionView = new FlagCollectionView;

flags.add({key:"value"});
你的问题在别处。

一些建议:

身份证vs类

通过组合一个类和一个id,您已经对选择器进行了过度限定。jQuery允许这样做,但是id选择器在页面上无论如何都应该是唯一的,所以将el:$'ul.flags'更改为el:$'ulflags'

杠杆骨干

我喜欢显式地将集合和/或模型传递给视图,并在视图上使用magic集合和模型属性

var flags = new FlagList;
var addFlagView = new AddFlagView({collection: flags});
var flagCollectionView = new FlagCollectionView({collection: flags});
这意味着在您的视图中,您将自动访问此.collection

取消绑定事件以避免重影视图

看起来我必须同意@fguillen的观点,你的问题一定是在如何初始化视图的某个地方,正如我在评论中提到的,这很可能与时间有关,即:在“添加”事件已经触发后将事件绑定到集合。

一些建议:

身份证vs类

通过组合一个类和一个id,您已经对选择器进行了过度限定。jQuery允许这样做,但是id选择器在页面上无论如何都应该是唯一的,所以将el:$'ul.flags'更改为el:$'ulflags'

杠杆骨干

我喜欢显式地将集合和/或模型传递给视图,并在视图上使用magic集合和模型属性

var flags = new FlagList;
var addFlagView = new AddFlagView({collection: flags});
var flagCollectionView = new FlagCollectionView({collection: flags});
这意味着在您的视图中,您将自动访问此.collection

取消绑定事件以避免重影视图


看起来我必须同意@fguillen的观点,你的问题一定是在如何初始化视图的某个地方,正如在我的评论中我提到的,这很可能与时间有关,即:在“添加”事件已经触发之后将事件绑定到集合。

如果你在犯了我犯的同样愚蠢错误之后来到这里,确保你有:

this.collection.bind( 'add', this.render )
而不是:


如果你在犯了我犯的同样愚蠢的错误后来到这里,请确保:

this.collection.bind( 'add', this.render )
而不是:


这是实际的执行顺序吗?ie:在初始化flagCollectionView之前是否发送了来自“click addFlag”的事件?在期望事件触发之前,将事件绑定到模型和集合非常重要。这是实际的执行顺序吗?ie:在初始化flagCollectionView之前是否发送了来自“click addFlag”的事件?在期望事件触发之前,将事件绑定到模型和集合是很重要的。非常好的解释,我以前用过类似于ghost视图的东西:非常有用。我做了你建议的改变。谢谢顺便说一句,关于身份证,这不是同样的事情吗?如果id“flags”在它所在的页面上是唯一的,我想我所需要的就是el:$“flags”。。。对吗?很好的解释,我以前用过类似于鬼的观点:非常有用。我做了你建议的改变。谢谢顺便说一句,关于身份证,这不是同样的事情吗?如果id“flags”在它所在的页面上是唯一的,我想我所需要的就是el:$“flags”。。。对吗?你是对的。代码中其他地方的异常导致脚本执行停止。谢谢你帮我找到线索!你是对的。代码中其他地方的异常导致脚本执行停止。谢谢你帮我找到线索!