所以我已经有好几天了。我正在开发应用程序的聊天组件。所有的通信都很好,聊天都用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