Backbone.js 如何从主干中的另一个视图绑定元素上的事件

Backbone.js 如何从主干中的另一个视图绑定元素上的事件,backbone.js,binding,views,underscore.js,models,Backbone.js,Binding,Views,Underscore.js,Models,我试图附加的事件来自另一个视图 我有两种看法 海德尔维 内容视图 我的headerView使用头模型,每次模型更改时,我都渲染()我的headerView 和大多数iPhone应用程序一样,我使用标题中的两个按钮进行导航,根据您所在的位置,图像可能会发生变化 这就是为什么在初始化随机contentView时,我可以访问headerView中的模型并更改属性 我需要做的最后一件事是为这个按钮创建一个点击事件 我试图在我的内容视图中绑定(这更有意义) 事件没有触发,只有当我将此事件放在heade

我试图附加的事件来自另一个视图

我有两种看法

  • 海德尔维
  • 内容视图
我的headerView使用头模型,每次模型更改时,我都渲染()我的headerView

和大多数iPhone应用程序一样,我使用标题中的两个按钮进行导航,根据您所在的位置,图像可能会发生变化

这就是为什么在初始化随机contentView时,我可以访问headerView中的模型并更改属性

我需要做的最后一件事是为这个按钮创建一个点击事件

我试图在我的内容视图中绑定(这更有意义)


事件没有触发,只有当我将此事件放在headerView中时才会发生,是否有推荐的干净解决方案可以这样做?

主干网的整个要点。视图是将DOM子树的修改和事件处理封装到视图类中。因此,主干网不支持您的场景

你有几个选择来达到相同的最终结果

简单(但错误)的方法:使用jQuery来侦听标头的事件:

var ContentView = Backbone.View.extend({
   initialize: function() {
     $(".h_left").on('click', this.newLocation);
   },

   remove: function() {
     $(".h_left").off('click', this.newLocation);
     Backbone.View.prototype.remove.call(this);
   }
});
这打破了header元素的封装,并将content视图与header元素的实现紧密耦合。换句话说:意大利面

正确的方法:使用中介将消息从标题传递到其他视图:

var HeaderView = Backbone.View.extend({
  events: {
    "click .h_left": "onLeftButtonClick"
  },

  onLeftButtonClick: function() {
    //You can use the root Backbone object as a global event bus
    //Publish a message
    Backbone.trigger('header:leftbutton');
  }
});

var ContentView = Backbone.View.extend({
   initialize: function() {
     //Subscribe to a message. If you use listenTo, the subscription is 
     //automatically cleared when your content view is destroyed.
     this.listenTo(Backbone, 'header:leftbutton', this.newLocation);
   },

   newLocation: function() {
     //..
   }
});

你能提供JSFIDLE吗?我想没有必要,我会再解释一下。h_在你的内容视图的
el
或标题中留下了
?它在标题中。在我们关闭这个内容视图时,我们不需要删除“listenTo”事件来防止内存泄漏吗?@KopaxJackHerrauer你不需要<当您
删除视图时,
listenTo
ed事件将被清除。查看backbonejs.org上的文档。谢谢……我也是backbone的新手。帮了我很多忙。也学到了新的东西。谢谢你,伙计。。。
var HeaderView = Backbone.View.extend({
  events: {
    "click .h_left": "onLeftButtonClick"
  },

  onLeftButtonClick: function() {
    //You can use the root Backbone object as a global event bus
    //Publish a message
    Backbone.trigger('header:leftbutton');
  }
});

var ContentView = Backbone.View.extend({
   initialize: function() {
     //Subscribe to a message. If you use listenTo, the subscription is 
     //automatically cleared when your content view is destroyed.
     this.listenTo(Backbone, 'header:leftbutton', this.newLocation);
   },

   newLocation: function() {
     //..
   }
});