Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Don';更改时渲染主干木偶集合视图?_Javascript_Sockets_Backbone.js_Marionette - Fatal编程技术网

Javascript Don';更改时渲染主干木偶集合视图?

Javascript Don';更改时渲染主干木偶集合视图?,javascript,sockets,backbone.js,marionette,Javascript,Sockets,Backbone.js,Marionette,在使用socket.io处理具有实时消息的应用程序时,我还需要保存消息。我选择使用mongodb,在客户端我使用主干网 我的问题是,当我发出一条新消息时,所有套接字/用户都会实时获取该消息,但发送该消息的套接字/用户会两次获取该消息,一次来自套接字,一次来自集合重新呈现 下面是我的收藏视图的外观 module.exports = CollectionView = Marionette.CollectionView.extend({ className: 'collection',

在使用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?也许有人解释了我如何防止发送消息的套接字/用户被附加两次

编辑:刚刚有了一个想法,我可以在制作新邮件时直接获取集合,而不是附加邮件?我试过了,效果很好,也许有更好的方法?我仍在思考,并对新想法持开放态度

编辑:这对我来说非常有效。我没有附加html,而是向所有连接的套接字发出GET请求,这样它们就可以获得新的数据

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!');
}
createMessage:函数(数据){
window.App.data.messages.fetch({
成功:函数(){
console.log('success')
}
}); 
//此.el.find('.message content').append(''+data.username+'':''+data.message+'');
window.App.core.vent.trigger('App:log','Chat View:收到新消息!');
}
上面的唯一问题是序列是POST,然后在毫秒内获取,因此GET请求可能会在POST完全完成之前返回数据


因此,我试图弄清楚如何设置回调,以便在POST成功添加到集合时使GET。如果我来的话,我会分享解决方案

您没有显示socket.io客户端代码,但我认为第二种方法更好。套接字应仅发送/接收数据。我假设您的套接字中至少有1个事件用于“receiveMessage”,1个事件用于“sendMessage”

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

  • 收到消息(或收到通知我有新消息)时,使用collection.add(消息)将消息添加到您的集合中。木偶将为您呈现该消息

  • 发送消息时,只需将其添加到集合中,或者等待服务器的回调(请参阅文档),以确保在添加到集合之前正确接收消息

  • 如果您使用的是木偶视图,请永远不要使用jQuery将某些内容附加到视图的HTML中!;)

    对于初始消息加载,第一次使用Collection.fetch()获取服务器上已经存在的所有消息(例如,在连接套接字之后)。从那时起,在消息到达时添加单个消息,而不是获取所有消息(您将保存bandwith)

    在类似的应用程序中,我所做的是在第一次连接时从套接字发送一条“Hello”消息,其中包括我需要的数据。然后我只做收集。用从套接字发送的数据重置(数据),你就可以开始了。套接字将初始化您的集合,并将一次更新一条消息


    希望有帮助

    抱歉这么晚了,我一直在和很多新东西调情。我绝对喜欢这种方法!正在尝试:)