Backbone 在第二次渲染调用后不更新模板

Backbone doesn't update the template after a second render call

我有一个 Backbone 视图,我正在使用 Handlebars 为渲染方法创建模板。

在我看来我有一个变量:

model  = [
        {key: '1', value: 'a'},
        {key: '2', value: 'b'},
        {key: '3', value: 'c'},
        {key: '4', value: 'd'}
       ]

我显示了几个输入并有以下监听事件:

'change input' : 'onInputChange'
$('.my-class').on 'keydown', (event) => @onKeydown(event)

所以这工作正常。当触发 change 事件时,我有一些逻辑可以根据新输入的值更新模型。这就是问题所在。

两个事件都在调用 render(),我可以验证最后一次调用 i 是否具有更新后的值,但是如果我更改输入值并触发 keydown 事件,我看不到更改,如果我再次触发它,那么我会得到,即使 console.log(model) 显示模型已经更新。

我的渲染函数如下所示:

render: ->
  @$el.html @template(model)

但是,如果我将其包装在 document.ready 中:

渲染:-> $(文档).ready(() => @$el.html @模板(模型) )

那么我的模板正在正确更新。

我的猜测是 change 事件可以被触发 onkeydown 所以两者几乎同时执行的事实与 render() 的执行混淆了,但是我我试图在 change 事件上延迟 1 秒,以确保在我进行第二次调用之前对 render() 的第一次调用已经完成。唉,这并没有改变输出,我仍然没有更新我的模板。仅将其包装在 document.ready 中似乎可以解决问题,但我不知道为什么,因此我不确定这是 prbolem 的实际解决方案。

您似乎在使用非委托 jQuery 事件侦听器,
$('.my-class').on 'keydown', (event) => @onKeydown(event).

在呈现 view/dom 并且匹配元素可用之前,这不会起作用(即使在绑定时视图在内存中,由 backbone 创建的委托事件也会起作用)。
一旦使用新元素重新呈现视图,它也会停止工作,除非重新绑定完成。

^ backbone 提供使用委托事件侦听器(事件哈希)的简单方法是有原因的。使用它应该可以解决问题