使用coffeescript的骨干上下文问题

时间:2013-06-06 21:31:59

标签: javascript backbone.js coffeescript

我有一个简单的日历,只要日期发生变化就会重新呈现。设置onClick日期后,触发change:date事件并调用render方法。

但是,由于html没有被替换,因此上下文已关闭。

我不知道为什么会这样,因为我使用=>来保留上下文,当我console.log @$el它总是向我显示同一个类时,即。 WidgetView

当我执行$(elementName).html而不是@$el.html时,它会起作用。想法?

class WidgetView extends sandbox.mvc.View

  className: 'sidebar-group'

  events:
    "click a" : "onClick"

  template: sandbox.template.compile tmpl

  initialize: (options) ->
    @date = new DateModel {rid:1000}
    @listenTo @date, "change:date", @render

  onClick: (e) ->
    e.preventDefault()
    # Get value
    value = $(e.currentTarget).text()
    # Set date model
    @date.set {date:value}
    # Emit model change event
    sandbox.emit "model.date.change", @date
    return false

  render: (model) =>
    data = CalendarResource()
    @$el.html @template {calendar: data}
    @

2 个答案:

答案 0 :(得分:2)

我认为问题非常简单。如果你没有看过它,请仔细看看。

  

object.listenTo(其他,事件,回调)

与bind

不同
  

object.on(event,callback,[context])

如果你看到listenTo没有以任何形式或形式设置回调的上下文。

尝试做

  @listenTo @date, "change:date", _.bind(@render, this);

Bleh我不是咖啡脚本,但你明白了。强制构造函数中的上下文始终是实例。

答案 1 :(得分:0)

问题

这个特殊问题的问题在于我使用的是JQuery Page Slide插件,该插件将元素复制到另一个节点。

结果,我正在更新参考节点,插件没有保持新节点同步。

解决方案

由于插件没有刷新方法,我将不得不复制元素并重新绑定所有事件。