Почему представление Backbone вызывает свою модель add во время привязки all для метода рендеринга? (Это реализация backbone + node.js) - PullRequest
0 голосов
/ 11 января 2012

Так что у меня это было довольно много дней.Я работаю над компонентом чата приложения.Все коммуникации работают нормально, чаты сохраняются с 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 голосов
/ 11 января 2012

Не знаю, почему вы получаете свою ошибку, но вам не нужно _.bindAll при использовании CoffeeScript.Просто используйте жирную стрелку для функции рендеринга:

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'
        @
0 голосов
/ 12 января 2012

Я понял это.

Это код инициализации 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

Связывает «добавить» к действию @addChat.

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

Так работает, но раньше у меня было:

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

Таким образом, проблема связана с привязкой 'all' к @addChat.

0 голосов
/ 11 января 2012

Я не уверен в этом, потому что coffeescript не мое, но

console.log(@.model), кажется, работает?но вы используете @model, когда вы пытаетесь связать метод, не должно ли это быть также

@.model.bind 'all', @render
...