为什么Backbone视图在绑定'all'到render方法期间调用其模型'add'? (这是主干+ node.js实现)

时间:2012-01-11 10:18:28

标签: node.js backbone.js coffeescript

所以我已经有好几天了。我正在处理应用程序的聊天组件。所有通信工作正常,聊天与Redis一起保存,Backbone控制器功能正常。问题是在前端渲染聊天条目。这是有问题的代码:

class views.ChatItemView extends Backbone.View
    tagName: 'li',

    initialize: (options) ->
        console.log(@.model)
        _.bindAll @, 'render'
        @model.bind 'all', @render

    render: ->
        $(@el).html @model.get('name') + ': ' + @model.get 'text'
        @

这是Firebug警告错误:

Uncaught TypeError: Object add has no method 'bind'
views.ChatItemView.ChatItemView.initializeviews.js:21
Backbone.Viewbackbone.js:884
ChatItemViewviews.js:13
views.ChatView.ChatView.addChatviews.js:76
Backbone.Events.triggerbackbone.js:117
_.extend._onModelEventbackbone.js:635
Backbone.Events.triggerbackbone.js:117
_.extend._addbackbone.js:595
_.extend.addbackbone.js:451
views.ChatView.ChatView.msgReceivedviews.js:90
NodeChatController.initcontroller.js:17
EventEmitter.emitsocket.io.js:627
SocketNamespace.onPacketsocket.io.js:2171
Socket.onPacketsocket.io.js:1861
Transport.onPacketsocket.io.js:1309
Transport.onDatasocket.io.js:1286
WS.open.websocket.onmessage

有没有人知道为什么会发生这种情况或有没有人遇到类似问题?

3 个答案:

答案 0 :(得分:0)

不确定为什么会收到错误,但是,使用CoffeeScript时不需要_.bindAll。只需使用胖箭头作为渲染功能:

class views.ChatItemView extends Backbone.View
    tagName: 'li',

    initialize: (options) ->
        console.log(@.model)
        @model.bind 'all', @render

    render: =>
        $(@el).html @model.get('name') + ': ' + @model.get 'text'
        @

答案 1 :(得分:0)

我明白了。

这是chatView初始化代码

class views.ChatView extends Backbone.View
    initialize: (options) ->
        @model.chats.bind 'add', @addChat
        @socket = options.socket

    msgReceived: (message) ->
            newChatEntry = new models.ChatItem
            newChatEntry.mport message.data
            @model.chats.add newChatEntry

它将'add'绑定到@addChat操作。

    addChat: (chat) ->
        view = new views.ChatItemView {model: chat}
        $('#chat_list').append view.render().el

这种方式很好但以前我有:

        @model.chats.bind 'all', @addChat

所以,将'all'绑定到@addChat会导致麻烦。

答案 2 :(得分:-1)

我不确定这是因为coffeescript不是我的事, 但是

console.log(@.model)似乎有用吗?但是在尝试bind方法时使用@model 不应该这也是

@.model.bind 'all', @render