Backbone.js 主干事件多次触发,即使我遵循适当的标准

Backbone.js 主干事件多次触发,即使我遵循适当的标准,backbone.js,backbone-events,Backbone.js,Backbone Events,我有一个表,当我点击一行时,在一个side div中显示详细信息。我在行(tr)上创建了一个事件,每次单击该行时都会触发该事件。我遇到的问题是,事件被触发了多次。它的作用就像每次触发事件时都会创建一个新视图,但不会创建一个新视图。代码如下: GroupView = class App.GroupView extends Backbone.View template: App.Utils.getTemplate 'group' selectedId: 0 events:

我有一个表,当我点击一行时,在一个side div中显示详细信息。我在行(tr)上创建了一个事件,每次单击该行时都会触发该事件。我遇到的问题是,事件被触发了多次。它的作用就像每次触发事件时都会创建一个新视图,但不会创建一个新视图。代码如下:

GroupView = class App.GroupView extends Backbone.View
    template: App.Utils.getTemplate 'group'
    selectedId: 0

    events:
        'click tr': 'selectGroup'

    selectGroup: (e) ->
        thisEl = $(e.currentTarget)
        $(thisEl).closest('tr').siblings().removeClass 'selected'
        $(thisEl).closest('tr').addClass 'selected'
        @selectedId = $(thisEl).data().id
        @getGroupDetails @selectedId

    render: -> 
        $(@$el).html @template
            groups: @collection.models

        if @selectedId is 0
            firstRowEl = $(@$el).find('tr:first')
            $(firstRowEl).addClass 'selected'
            @selectedId = $(firstRowEl).data().id

        @getGroupDetails @selectedId

    getGroupDetails: (id, platform) ->
        $('<img/>', 
            src: 'img/ajax_loader_2.gif'
            class: 'ajax-loader'
            ).appendTo '.group-details'

        renderGroupDetails id

groupDetails = new GroupDetailsView
    el: '.group-details'
    model: groupDetailsModel

renderGroupDetails = (id)->
    groupDetails.el = '.group-details'
    groupDetails.stopListening groupDetailsModel
    groupDetails.listenTo groupDetailsModel, 'change', ->
    groupDetails.model = 
        groupDetails: groupDetailsModel.toJSON()
    groupDetails.render()

    groupDetailsModel.fetch
        data:
            id: id
        processData: true
GroupView=class App.GroupView扩展了主干.View
模板:App.Utils.getTemplate“组”
已选择的ID:0
活动:
'单击tr':'选择组'
选择组:(e)->
thisEl=$(e.currentTarget)
$(thisEl).closest('tr').sides().removeClass“selected”
$(thisEl).最近('tr')。addClass'已选定'
@选择edid=$(thisEl).data().id
@getGroupDetails@selectedId
渲染:->
$(@$el).html@模板
组:@collection.models
如果@selectedId为0
firstRowEl=$(@$el).find('tr:first'))
$(firstRowEl).addClass“已选定”
@选择EDID=$(firstRowEl).data().id
@getGroupDetails@selectedId
getGroupDetails:(id,平台)->
$('
groupDetails.el='.groupDetails'
groupDetails.stopListening groupDetails模型
groupDetails.listenTo groupDetails模型,“更改”,->
groupDetails.model=
groupDetails:groupDetailsModel.toJSON()
groupDetails.render()
groupDetailsModel.fetch
数据:
id:id
processData:true
问题是,当我使用
groupDetails.stopListening groupDetailsModel
时,多事件触发问题得到解决,但是
groupDetails
视图中的所有事件都没有被触发

感谢您的帮助

干杯


Kianosh

所以,给你一个具体的答案是困难的:你粘贴的代码有点难以理解,而且看起来可能缺少一些位(例如,
groupDetailsModel
是什么?它是否有影响其视图的逻辑?).不过没关系,因为我认为您需要的是调试帮助,而不是具体的答案

如果我理解正确,您的问题是
groupDetails.render()
被额外调用,您不确定调用它的原因或原因:正确吗?如果正确,您可靠的调试器可以在几秒钟内回答这个问题

注意:我将要说的一切都适用于Chrome(内置开发工具)或Firefox(Firebug扩展)。它可能也适用于其他浏览器及其工具,我只是不能肯定,因为我没有使用它们

方法#1:调试器

启动调试器后,首先在
GroupDetails.prototype.render
方法中添加
debugger;
行。这将使浏览器在点击该行时暂停。暂停时,您可以检查“调用堆栈”在右侧,这将精确显示代码中的哪个位刚刚调用了该渲染。您还可以使用调试器检查环境中不同变量的值,以尝试了解代码调用
渲染的原因

进近#2:控制台跟踪

如果您不喜欢使用调试器,那么还有另一个工具非常适合回答此类问题。只需将
console.trace()
添加为渲染方法的第一行,然后正常运行代码。这一次,您的浏览器将登录(到“console”)从代码中的该点生成的堆栈跟踪。此堆栈跟踪类似于使用
调试器时可以看到的调用堆栈,因此它将准确地告诉您每次调用
渲染的代码


希望这能有所帮助。

因此,给你一个具体的答案是困难的:你粘贴的代码有点难以理解,而且看起来可能缺少一些位(例如,什么是
groupDetailsModel
?它是否有影响其视图的逻辑?).不过没关系,因为我认为您需要的是调试帮助,而不是具体的答案

如果我理解正确,您的问题是
groupDetails.render()
被额外调用,您不确定调用它的原因或原因:正确吗?如果正确,您可靠的调试器可以在几秒钟内回答这个问题

注意:我将要说的一切都适用于Chrome(内置开发工具)或Firefox(Firebug扩展)。它可能也适用于其他浏览器及其工具,我只是不能肯定,因为我没有使用它们

方法#1:调试器

启动调试器后,首先在
GroupDetails.prototype.render
方法中添加
debugger;
行。这将使浏览器在点击该行时暂停。暂停时,您可以检查“调用堆栈”在右侧,这将精确显示代码中的哪个位刚刚调用了该渲染。您还可以使用调试器检查环境中不同变量的值,以尝试了解代码调用
渲染的原因

进近#2:控制台跟踪

如果您不喜欢使用调试器,那么还有另一个工具非常适合回答此类问题。只需将
console.trace()
添加为渲染方法的第一行,然后正常运行代码。这一次,您的浏览器将登录(到“console”)从代码中的该点生成的堆栈跟踪。此堆栈跟踪类似于使用
调试器时可以看到的调用堆栈,因此它将准确地告诉您每次调用
渲染的代码


希望能有所帮助。

你是说
selectGroup
是getti