不要在变化中呈现主干牵线木偶集合视图吗?

时间:2014-03-27 02:13:16

标签: javascript sockets backbone.js marionette

使用socket.io处理具有实时消息的应用程序时,我还需要保存消息。我选择使用mongodb,在客户端我使用骨干。

我的问题是,当我发出新消息时,所有套接字/用户实时获取消息,但发送消息的套接字/用户从套接字获取两次,一次从集合重新呈现。

以下是我的收藏夹视图。

module.exports = CollectionView = Marionette.CollectionView.extend({

    className: 'collection',
    initialize: function() {
        //this.listenTo(this.collection, 'change', this.render);
    },
    itemView: MessageView

}); 

我评论了this.listenTo(this.collection, 'change', this.render);。所以我问这个问题,因为默认情况下牵线木偶可以渲染CollectionView吗?也许某人有一个解释我如何阻止发送消息的套接字/用户被附加两次?

编辑刚刚有了一个想法,而不是附加消息,我可以在新消息发送时获取该集合?我试过它并且它有效,也许有更好的方法?我还在想,并且愿意接受新想法!

编辑:这对我来说效果很好。我只是向连接的所有套接字发出GET请求,而不是附加html,这样他们就可以获得新数据。

createMessage: function(data) {
    window.App.data.messages.fetch({
        success: function() {
            console.log('success')
        }
    }); 
    //this.$el.find('.message-content').append('<div class="message"><b>'+data.username+':</b>'+data.message+'</div>');
    window.App.core.vent.trigger('app:log', 'Chat View: Received a new message!');
}

只有上面的问题是序列是POST,然后GET在彼此的毫秒之内,所以GET请求可能在POST完全结束之前返回数据。

所以我试图找出如何设置回调,以便在POST成功添加到集合时进行GET。如果我来的话,我会分享解决方案。

1 个答案:

答案 0 :(得分:1)

您没有显示您的socket.io客户端代码,但我认为您的第二种方法更好。套接字应该只发送/接收数据。我假设您的套接字中至少有一个事件是&#34; receiveMessage&#34;和1发出&#34; sendMessage&#34;。

我认为你可以在你的客户端套接字中:

  1. 收到邮件时(或我收到通知我有新邮件),请使用Collection.add(邮件)将邮件添加到您的收藏中。木偶将为你呈现这条信息。

  2. 发送邮件时,只需将其添加到您的收藏中,或等待来自服务器的回调(请参阅文档)以确保在添加到收藏集之前已正确收到该邮件。

  3. 如果你正在使用Marionette视图,那么永远不要用jQuery在视图的HTML上添加一些内容! ;)

    对于初始消息加载,首次使用Collection.fetch()(例如,一旦连接套接字),就可以获取服务器上已有的所有消息。从那时起,添加单个消息而不是全部取消(您将保存带宽)。

    我在类似的应用程序中所做的是从套接字a&#34; Hello&#34;第一次连接时的消息,包括我需要的数据。然后我只使用从套接字发送的内容进行Collection.reset(数据),你就可以了。您的套接字将初始化您的集合,并将一次更新一条消息。

    希望它有所帮助!