在骨干视图之间进行通信

时间:2013-09-09 10:16:07

标签: backbone.js

var myView = Backbone.View.extend( {

   events: {
       'click #selector' : 'onClick'
    },

   onClick: function( event ) {

   }
})

onClick事件对于所有视图都是全局的,还是仅包含将拦截它的视图?

假设我有另一个想要在调用onClick时做出反应的View,这样做的最佳方式是什么?

我应该为MyView:onClick等事件指定名称,还是这不是必需的?

2 个答案:

答案 0 :(得分:0)

我知道如何调用事件的三种方式:

第一:通常,它知道每个人。方式是在其视图中的呼叫事件(我认为,你不需要任何例子)

第二:调用事件parent(并不意味着扩展)视图。例如:

<body> 
  <div id="content">

    <div id="view1" >
      <input type="checkbox" id="first_view_element">
    </div> 
    <div id="view2" >
      <input type="checkbox" id="second_view_element">
    </div> 

  </div> 
</body> 

如果是这样的话:父视图的el是&#39; #content&#39;和子视图的el是&#39;#view1&#39;,您可以在父视图中写入

  events: {
    'click #first_view_element' : 'onClick'
  }

第三:在完全不同的视图中调用事件。在这种情况下,我尝试使用上面的html代码来解释。如果一个视图的el是&#39;#view1&#39;而另一个el是&#39;#view2&#39;

App.hendChangesObj = 0 // it was simple name, i couldn't find variable name and param
App.View1 = Backbone.View.extend({

  events: {
   'click #first_view_element' : 'onClick'
  },

  onClick: function( event ) {
    App.hendChangesObj++;
  }

});
App.View2 = Backbone.View.extend({

  initialize: function() {
    this.listenTo(App.hendChangesObj, "change", this.onClick);
  },

  onClick: function() {
    // do something 
  }

});

答案 1 :(得分:0)

  

对于所有视图,onClick事件是全局的,还是仅包含将拦截它的View?

Backbone使用委托事件,这意味着所有事件侦听器都绑定到视图的根元素(this.el)。因此,事件仅对一个特定视图实例可见。

  

假设我有另一个想要在调用onClick时做出反应的View,这样做的最佳方式是什么?

最纯粹的主干方法是使两个视图共享一个模型实例,并让被点击的视图更改模型,可能像this.selectionModel.set('selected', true);。此模型将表示跨视图共享的状态。它不一定必须是服务器端数据库的状态,以适应MVC范例。

另一个可行的选择是让视图本身发出事件:

onClick: function (event) {
  this.trigger('click', event); //or 'selected' might be better
}

然后,您可以在路由器的源视图和目标视图之间绑定事件处理程序。

  

我是否应该命名我的事件,例如MyView:onClick或者这不是必需的吗?

当你有一个小代码库和少量事件时。但是,我会使骨干层域中的事件名称具体,而不是复制浏览器的通用UI输入事件名称。因此,考虑到“选择”或“激活”,或者根据您的应用程序逻辑,任何有意义的内容都不是“点击”。