Javascript Don';更改时渲染主干木偶集合视图?
在使用socket.io处理具有实时消息的应用程序时,我还需要保存消息。我选择使用mongodb,在客户端我使用主干网 我的问题是,当我发出一条新消息时,所有套接字/用户都会实时获取该消息,但发送该消息的套接字/用户会两次获取该消息,一次来自套接字,一次来自集合重新呈现 下面是我的收藏视图的外观Javascript Don';更改时渲染主干木偶集合视图?,javascript,sockets,backbone.js,marionette,Javascript,Sockets,Backbone.js,Marionette,在使用socket.io处理具有实时消息的应用程序时,我还需要保存消息。我选择使用mongodb,在客户端我使用主干网 我的问题是,当我发出一条新消息时,所有套接字/用户都会实时获取该消息,但发送该消息的套接字/用户会两次获取该消息,一次来自套接字,一次来自集合重新呈现 下面是我的收藏视图的外观 module.exports = CollectionView = Marionette.CollectionView.extend({ className: 'collection',
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”消息,其中包括我需要的数据。然后我只做收集。用从套接字发送的数据重置(数据),你就可以开始了。套接字将初始化您的集合,并将一次更新一条消息
希望有帮助 抱歉这么晚了,我一直在和很多新东西调情。我绝对喜欢这种方法!正在尝试:)