通过混合使用 Backbone.View 事件方法
Use Backbone.View events method through a mixin
我在应用程序中使用 Backbone 和 Coffeescript。现在,我将使用的示例尽可能简单。我的应用程序中有一个 header,所有视图都共享它。此 header 有一个带有 #logout 索引的注销 link。现在我要做的是将事件方法和事件在混合 object 中触发时将使用它的方法放在一起,并扩展我的 Backbone 视图的原型。这是代码:
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 初始化时,首先调用 initialize 方法。
来自fine manual:
events view.events
or view.events()
[...]
Backbone will automatically attach the event listeners at instantiation time, right before invoking initialize
.
您正在尝试在 initialize
中添加事件,但事件在 initialize
被调用之前被绑定。
您可以在更新原型后自行调用 delegateEvents
重新绑定事件:
initialize: (options)->
_.extend(View.prototype, Mixin.Header)
@delegateEvents() # <----------
但结构会有点奇怪,因为您将在实例中修改 class。
我认为你最好在有任何实例之前修改 class:
class View extends Backbone.View
_.extend(View.prototype, Mixin.Header)
或者您可以使用 prototype
:
的 CoffeeScript 快捷方式
class View extends Backbone.View
_.extend(View::, Mixin.Header)
# -----------^^
甚至:
class View extends Backbone.View
_.extend(@::, Mixin.Header)
如果 View
有自己的 events
,您仍然会 运行 遇到问题,因为 _.extend
会盲目地覆盖属性而不是合并它们。你需要比 _.extend
更聪明的东西来正确处理这个问题,它需要能够弄清楚如何合并 events
函数和对象。
我在应用程序中使用 Backbone 和 Coffeescript。现在,我将使用的示例尽可能简单。我的应用程序中有一个 header,所有视图都共享它。此 header 有一个带有 #logout 索引的注销 link。现在我要做的是将事件方法和事件在混合 object 中触发时将使用它的方法放在一起,并扩展我的 Backbone 视图的原型。这是代码:
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 初始化时,首先调用 initialize 方法。
来自fine manual:
events
view.events
orview.events()
[...]
Backbone will automatically attach the event listeners at instantiation time, right before invokinginitialize
.
您正在尝试在 initialize
中添加事件,但事件在 initialize
被调用之前被绑定。
您可以在更新原型后自行调用 delegateEvents
重新绑定事件:
initialize: (options)->
_.extend(View.prototype, Mixin.Header)
@delegateEvents() # <----------
但结构会有点奇怪,因为您将在实例中修改 class。
我认为你最好在有任何实例之前修改 class:
class View extends Backbone.View
_.extend(View.prototype, Mixin.Header)
或者您可以使用 prototype
:
class View extends Backbone.View
_.extend(View::, Mixin.Header)
# -----------^^
甚至:
class View extends Backbone.View
_.extend(@::, Mixin.Header)
如果 View
有自己的 events
,您仍然会 运行 遇到问题,因为 _.extend
会盲目地覆盖属性而不是合并它们。你需要比 _.extend
更聪明的东西来正确处理这个问题,它需要能够弄清楚如何合并 events
函数和对象。