0
var myView = Backbone.View.extend( {

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

   onClick: function( event ) {

   }
})

上面的onClick事件对所有视图都是全局的,还是只有包含视图会拦截它?

假设我有另一个 View 想要在调用 onClick 时做出反应,那么最好的方法是什么?

我应该为我的事件命名空间吗,MyView:onClick或者这不是必需的吗?

4

2 回答 2

0

上面的 onClick 事件对所有视图都是全局的,还是只有包含视图才会拦截它?

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

假设我有另一个 View 想要在调用 onClick 时做出反应,那么最好的方法是什么?

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

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

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

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

我应该命名我的事件,例如 MyView:onClick 还是没有必要?

当你有一个小的代码库和少量的事件时不是这样。但是,我会在骨干层域特定的事件名称,而不是重复浏览器的通用 UI 输入事件名称。因此,不要考虑“点击”,而是考虑“选择”或“激活”或任何对您的应用程序逻辑有意义的东西。

于 2013-09-09T13:13:37.653 回答
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是'#content',子视图el是'#view1',你可以在父视图内写

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

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

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 
  }

});
于 2013-09-09T11:36:56.777 回答