【问题标题】:proper way to dynamically assign backbone.js view el动态分配backbone.js视图el的正确方法
【发布时间】:2012-06-26 15:12:23
【问题描述】:

我想创建两个(或更多)视图实例,每个实例具有不同的 el 属性,并通过主干.js 视图的事件哈希(而不是通过 jQuery)将事件绑定到它们。

当所有实例具有相同的el 时触发事件很容易:

someView = Backbone.View.extend({
  el: '#someDiv',

  events: {
    'click': 'someFunction'
  },

  someFunction: function(){
    //Do something here
  }
});

到目前为止,如果我在initialize函数中分配el,并正常设置events如下,事件不会触发:

someView = Backbone.View.extend({
  events: {
    'click': 'someFunction'
  },

  initialize: function( options ){
    this.el = options.el
  },

  someFunction: function(){
    //Do something here
  }
});

我的第一个直觉是让el 成为一个函数,它返回感兴趣的 dom 元素的字符串表示:

someView = Backbone.View.extend({
  el: function(){
    return '#someDiv-' + this.someNumber
  },

  events: {
    'click': 'someFunction'
  },

  initialize: function( options ){
    this.someNumber = options.someNumber
  },

  someFunction: function(){
    //Do something here
  }
});

但是,如果我有 x 个 someView 的实例化,这会触发 x 次 someFunction

接下来我尝试在initialize 中设置elevents 属性:

someView = Backbone.View.extend({

  initialize: function( options ){
    this.el = options.el
    this.events = {
      'click': 'someFunction'
    }
  },

  someFunction: function(){
    //Do something here
  }
});

但这不会触发事件。在这一点上,我几乎在钓鱼。

有谁知道如何使用特定于该实例的el 实例化一个backbone.js 视图,该实例具有仅针对该实例触发的事件,而不是View 的其他实例?

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    您实际上并不需要浏览所有“this.element”的东西。

    Backbone 自动将视图的“el”设置为作为选项传递给构造函数的“el”。

    然后在整个视图中以“this.el”的形式提供。

    这就是你需要做的所有事情:

    x = Backbone.View.extend({
        events: {
          'click': 'say_hi'
        },
    
        initialize: function( options ){
            // Not actually needed unless you're doing something else in here
        },
    
        say_hi: function(){
          alert( this.el.id );
        }
    
      });
    
    y = new x( {el: '#div-1'} );
    z = new x( {el: '#div-2'} );
    
    z.say_hi();
    y.say_hi();
    ​
    

    看到这个现场 jsFiddle:http://jsfiddle.net/edwardmsmith/QDFwf/15/

    您的第二个示例不起作用的原因是,使用最新版本的 Backbone,您不能再直接设置“el”。正如您所注意到的,这不会正确设置/更新事件。

    不起作用

    initialize: function( options ){
      this.el = options.el;
    }
    

    如果您想以这种方式动态设置 el,则需要使用 View.setElement,因为它可以正确委托事件并设置缓存的 this.$el

    作品

    initialize: function( options ){
      this.setElement(options.el)
    }
    

    您的第二个示例的实时 jsFiddle:http://jsfiddle.net/edwardmsmith/5Ss5G/21/

    但这只是重新做 Backbone 中已经在做的事情。

    【讨论】:

    • 更新了两个 jsfiddle 以从 CDNjs 而不是从 github 获取下划线和主干。假设这是您看到的问题。
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多