0

我正在使用backbone.js 这是我的场景

可以说我有一个名为FooView

class FooView extends Backbone.view

  initialize:->
    $('#manage-foo').bind('click', @render)

  render: ->
    //whatever I want to render

我想绑定对元素#manage-foo 的单击以呈现我的视图或调用我的视图 FooView 的函数,但我不想松散调用函数的上下文,应该调用函数 render 并this指向FooView 而不是元素我如何实现这一点。?

我的情况是我在 pageLoad 上创建了 FooView 并且我必须在单击给定元素时显示它

谢谢

4

3 回答 3

3

不确定这是否能 100% 回答您的问题,但可以_.bindAll(this, 'render');解决上下文丢失的问题。您可以添加所有需要执行此操作的方法,因此您可以_.bindAll(this, 'render,click');添加单击方法。

http://arturalib.com/hello-backbonejs/docs/1.html

于 2012-06-16T20:07:47.537 回答
1

那里的 bind 方法用于将方法绑定到上下文,而不是注册事件处理程序。

你应该尝试的是:

class FooView extends Backbone.View
  events:
    "click #manage-foo": "render"  
     # this registers @render as the event handler for clicking on the #manage-foo element in the view

  render: ->
    # your rendering code

感谢 Trevor(在评论中)指出您不再需要使用 _.bindAll 来绑定事件对象中定义的事件的上下文。(更新了代码以反映这一点)

在 events 对象中定义的任何事件处理程序都将在 FooView 的上下文中自动执行。

于 2012-06-16T20:05:00.547 回答
1

如果#manage-foo是你的孩子,FooView那么@el你可以使用 Backbone 的事件系统:

class FooView extends Backbone.View
  events:
    'click #manage-foo': 'render'
  #...

如果#manage-foo不在视图的元素内,events则将无法工作,因为事件处理基于 jQuery delegate,并且delegate调用附加到视图的@el. 在这种情况下,您应该render使用粗箭头 ( =>)进行定义,以确保它this在调用时始终具有正确性:

render: =>
  #...

您还需要remove在您的视图中避免泄漏对您的视图的引用:

remove: ->
  $('#manage-foo').off('click', @render)
  Backbone.View::remove.apply(@)
于 2012-06-16T20:14:31.407 回答