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



所以我已经有好几天了。我正在开发应用程序的聊天组件。所有的通信都很好,聊天都用Redis保存,主干控制器的功能也很好。问题是在前端呈现聊天条目。这是有问题的代码:

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

有人知道为什么会发生这种情况吗?或者有人有类似的问题吗?

不确定为什么会出现错误,但是,使用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'
        @

我想明白了。

这是聊天视图初始化代码

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导致了问题。

我对此不确定,因为咖啡脚本不是我的爱好,但是

console.log(@.model)似乎起作用了?但是在尝试绑定方法时使用@model这不应该也是吗

@.model.bind 'all', @render

相关内容

最新更新