【发布时间】:2014-02-04 14:42:41
【问题描述】:
我是 Backbone 的新手,我在 Rails 中将它与 jQuery 一起使用。在我的视图render 方法中,我使用delegateEvents 将事件处理程序绑定到ID 为btn-go 的按钮的“单击”事件。此按钮本身由相关视图呈现。
单击按钮将表单的值存储在一个数组中,并导致视图重新呈现。此按钮本身由相关视图呈现。这在我第一次单击按钮时有效,但第二次没有任何反应,即使视图确实正确地重新渲染了它的模板。
class MyApp.Views.ChainsNew extends Backbone.View
# @template is defined by a conditional inside render()
render: (step_number) ->
window.model = @model
@step_number = step_number
@template = if @step_number is 1 then JST['chains/new'] else JST['chains/step']
$(@el).html(@template())
@delegateEvents({
'click #btn-go': 'add_step'
})
@
add_step: ->
#divide array into arrays of steps before and after step being edited
steps = @model.get('steps')
array1 = steps.slice(0, @step_number - 1)
array2 = steps.slice(@step_number)
array1.push(@$el.find('textarea').val())
newArray = array2.concat(array1)
@model.set({
steps: newArray
})
视图的render 方法被路由器调用。正如您在下面的代码中看到的,路由器正在侦听模型上的change 事件。这会导致它更新 URL,进而触发路由器的 step 方法被调用,并且最终在该方法中调用视图的 render 方法。
class MyApp.Routers.Chains extends Backbone.Router
routes:
'chains/new(/)': 'new'
'chains/new/step/:step_number(/)': 'step'
initialize: ->
# Model
@model = new MyApp.Models.Chain()
@listenTo(@model, "change", ->
@goto_step_number @model.get('steps').length + 1
)
# Views
@view_new = new MyApp.Views.ChainsNew({
model: @model
})
step: (url_step_number) ->
# Before rendering the view, make sure URL & number of steps in model are correctly related
url_step_number = parseInt url_step_number
steps_entered = @model.get('steps').length
if url_step_number > steps_entered + 1
@goto_step_number steps_entered + 1
else
$('#main-container').html(@view_new.render(url_step_number).el)
new: ->
@goto_step_number 1
goto_step_number: (step_number) ->
@.navigate('chains/new/step/' + step_number, trigger: true)
为什么我第二次单击该按钮时没有任何反应?我猜测事件处理程序没有正确绑定到按钮,但我不知道为什么。
【问题讨论】:
-
你的两个模板都有“*btn-go”按钮吗?尤其是“链/步”?
-
@DavidSulc 是的。
-
与
delegateEvents调用 (jsfiddle.net/ambiguous/2SnDn) 或仅与普通的events映射 (jsfiddle.net/ambiguous/8q8XH) 一起工作正常。你是如何使用这个视图的?什么触发了render调用? -
@muistooshort 我更新了我的帖子以显示我的路由器的代码,以及单击 go 按钮导致的方法调用序列的说明。
标签: javascript jquery backbone.js jquery-events backbone-events