通过mixin使用Backbone.View事件方法
Use Backbone.View events method through a mixin
我在应用程序中使用带有Coffeescript的Backbone。现在,我将使用的示例尽可能简单。我的应用程序中有一个标题,所有视图都共享它。此标头具有带有 #logout 索引的注销链接。现在我要做的是将事件方法和事件在触发时将使用它的方法放在 mixin 对象中,并扩展我的 Backbone View 的原型。这是代码:
Mixin.Header =
events: ->
'click #logout': 'logout'
logout: (e)->
e.preventDefault()
$.ajax(
type: 'DELETE'
url: '/logout'
).then(
->
document.location = ''
)
class View extends Backbone.View
initialize: (options)->
_.extend(View.prototype, Mixin.Header)
我一直在查看 Backbone 源代码,但我根本找不到为什么这不起作用的问题。事件通过 delegateEvents() 方法委托给 View,当 View 初始化时,首先调用初始化方法。
来自精细手册:
事件
view.events
或view.events()
[...]
Backbone 将在实例化时自动附加事件侦听器,就在调用initialize
之前。
您正在尝试在 initialize
中添加事件,但事件在调用之前已绑定initialize
。
您可以在更新原型后自行调用delegateEvents
以重新绑定事件:
initialize: (options)->
_.extend(View.prototype, Mixin.Header)
@delegateEvents() # <----------
但是结构会有点奇怪,因为您将修改实例中的类。
我认为您最好在拥有任何实例之前修改类:
class View extends Backbone.View
_.extend(View.prototype, Mixin.Header)
或者你可以使用 CoffeeScript 快捷方式进行prototype
:
class View extends Backbone.View
_.extend(View::, Mixin.Header)
# -----------^^
甚至:
class View extends Backbone.View
_.extend(@::, Mixin.Header)
如果View
有自己的events
,您仍然会遇到问题,因为_.extend
盲目地覆盖属性而不是合并它们。你需要一些比_.extend
更聪明的东西来正确处理这个问题,并且它需要能够弄清楚如何合并events
函数和对象。
相关文章:
- 如何防止jQueryonclick事件中的Ruby方法在页面刷新时执行
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 如何在所有ng点击事件AngularJS上启动一个方法
- 关闭第二个事件源上的第一个事件源's onopen方法
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 异步处理所有事件处理程序的方法
- 调用DOM提交方法时未激发jQuery提交事件
- 如何收听骨干事件方法上的keydown
- 服务器发送的事件方法未由 Firefox 处理
- Javascript - 事件方法中的引用对象
- jQuery委托事件方法对网格的好处
- 通过mixin使用Backbone.View事件方法
- 如何在传单中使用 .off() 事件方法.js
- 在完整日历上使用客户端事件方法过滤事件
- Backbone.js once()事件方法:计数器增量示例
- 不同事件方法的代码重用
- jQuery事件方法:如何更改javascript'单击'事件到'永远开火;
- JQuery事件方法影响类的一个元素
- 合并jQuery事件方法的正确方法
- 如何在angular 2中动态地将params传递到点击事件方法中