Javascript 开和关事件不发生';工作不好

Javascript 开和关事件不发生';工作不好,javascript,backbone.js,backbone-events,backbone.js-collections,Javascript,Backbone.js,Backbone Events,Backbone.js Collections,我使用新集合创建视图 I启动添加和同步事件: this.mapDetailsCOllection.on('add', self.onAddElement, self); this.mapDetailsCOllection.on('sync', self.onSync, self); 在取回之前: this.mapDetailsCOllection.off("add"); this.mapDetailsCOllection.fetch(); 当fetch正常时,在我的同步回调中: this.m

我使用新集合创建视图

I启动添加和同步事件:

this.mapDetailsCOllection.on('add', self.onAddElement, self);
this.mapDetailsCOllection.on('sync', self.onSync, self);
在取回之前:

this.mapDetailsCOllection.off("add");
this.mapDetailsCOllection.fetch();
当fetch正常时,在我的同步回调中:

this.mapDetailsCOllection.on('add', self.onAddElement, self);
但即使我推迟了添加事件,每次提取时我都会进入添加事件回调函数。

基于此:

通过使用可用的集合,可以自定义提取行为 选项。例如,要获取集合,请获取“添加”事件 对于每个新模型,以及对于每个已更改的现有模型的“更改”事件 模型,但不删除任何内容:

这是:

将触发所有适当的“添加”、“删除”和“更改”事件 就这样发生的。返回集合中被触摸的模型。如果 如果要自定义该行为,可以使用以下选项禁用该行为: {add:false}、{remove:false}或{merge:false}

你可以通过

collection.fetch({add: false}) 

为了避免触发
add
事件。

我将提出以下建议,因为我没有任何关于您如何构建应用程序的上下文(Backbone.js很好,因为它给了您很多约束,但是您如何构建应用程序可以极大地改变您需要实现同步解决方案的方式)。我非常乐意调整、扩展或澄清这篇文章,如果你能分享更多关于你如何构建你的应用程序、视图、集合和模型代码的信息,让我了解你想要实现的目标

在您的代码中,我将听
update
事件,而不是
add
事件(因为
add
会触发添加到集合中的每个新项目,而
update
会在从集合中添加/删除任何数量的项目后触发)。然后我会删除
add
事件的on/off更改,让您的视图侦听事件,而不是关闭和打开获取/同步周期的侦听器

我过去成功地使用过这种类型的视图设计模式:

var _ = require('lodash');
var DocumentRow = Backbone.View.extend({
  events: {
    "click #someEl": "open"
  },

  clean: function() {
    // cleans up event bindings to prevent memory leaks
  },

  initialize: function(options) {
    _.bindAll(this, [
      'initialize',
      'open',
      'render',
      'clean'
    ]);

    options = options || {};
    this.collection = options.collection ? options.collection : SomeCollection;
    this.listenTo(this.collection, "reset", this.render);
  },

  open: function(item) {
    ...
  },

  render: function() {
    ...
  }

});

请包括一个.Why
\uu.bindAll
this.listenTo
events
回调在本例中自动具有视图上下文<代码>选项。集合在初始化之前,在构造函数中也设置为
此。集合
。感谢Emile的指导。我已经有几年没有使用主干网进行生产应用程序开发了。这些都是我上次使用主干时没有出现的更改。公平地说,
listenTo
是在2012年12月13日在v0.9.9中添加的,但是
events
collection
选项是在0.1.0中添加的。我仍然想知道为什么
..bindAll
,如果您将
view.render
作为回调传递,可能是因为它与此无关。我的示例本质上非常简单。我使用了u.bindAll方法来确保视图中定义的方法是可访问的,并且能够被垃圾收集。我建议使用clean方法销毁事件绑定,当与子视图和超级视图一起使用时,偶尔会导致应用程序内存泄漏,这要追溯到2013年,当时我还在BB中积极开发。当我使用BB时,视图上定义的事件不会自动绑定到视图,并且无法从超级视图或子视图中进行GC。内存泄漏主要发生在上的
,添加了
listenTo
以帮助解决此问题。自定义
clean
函数模式()是另一个确保所有内容都未绑定的良好实践。
var _ = require('lodash');
var DocumentRow = Backbone.View.extend({
  events: {
    "click #someEl": "open"
  },

  clean: function() {
    // cleans up event bindings to prevent memory leaks
  },

  initialize: function(options) {
    _.bindAll(this, [
      'initialize',
      'open',
      'render',
      'clean'
    ]);

    options = options || {};
    this.collection = options.collection ? options.collection : SomeCollection;
    this.listenTo(this.collection, "reset", this.render);
  },

  open: function(item) {
    ...
  },

  render: function() {
    ...
  }

});