Node.js 主干网。关系、实时和处理大型数据
我正在使用Backbone.js、node.js和socket.io构建一个实时提要应用程序 我的Node.js 主干网。关系、实时和处理大型数据,node.js,backbone.js,socket.io,backbone-relational,Node.js,Backbone.js,Socket.io,Backbone Relational,我正在使用Backbone.js、node.js和socket.io构建一个实时提要应用程序 我的Feed是Update模型的集合。显示这些,覆盖Backbone.sync,以便与socket.io集成,效果良好 每个更新都有一组与之相关联的注释。当我在Feed视图中显示每个Update时,我希望显示相关评论的摘要(评论数量和单个“最流行”的评论),并且能够通过点击不同的视图来单独显示每个Update,带有更多数据的分页评论列表 我正在使用backbone relational对Update模型
Feed
是Update
模型的集合。显示这些,覆盖Backbone.sync
,以便与socket.io
集成,效果良好
每个更新都有一组与之相关联的注释。当我在Feed
视图中显示每个Update
时,我希望显示相关评论的摘要(评论数量和单个“最流行”的评论),并且能够通过点击不同的视图来单独显示每个Update
,带有更多数据的分页评论列表
我正在使用backbone relational
对Update
模型和Comment
模型之间的关系建模,如下所示:
Feed(collection)->Update(model)-(有很多)->Comment(model)
我一直在学习这本主干关系教程,但它似乎假设我希望在提要
视图中同时将所有相关数据存储在内存中,我不这么认为,因为可能会有数千条注释实时更新:
我的问题是:
如何在不加载所有注释数据的情况下,将注释的摘要数据引入到我的提要
视图中的每个更新
,并保持在我的更新
视图中显示分页完整数据的能力
我正在使用主干.layoutmanager
渲染视图。我应该如何最好地打破我的观点来实现上述目标
第一季度:
- 我假设您使用的是类似于在Backbone.sync中使用socket.io而不是REST API或类似的解决方案
- 在
Update
中包含元数据(如注释的#)作为属性。如果Update
对象本身很重,则可以使用和自定义服务器端socket.io事件更新计数,而不是每次都发送整个对象
- 将属性
topcoment
作为附加的一对一关系包含在Update
中。最初从服务器加载Update
时,在响应中包括topcoment
,但不包括其他注释
- 使用自定义socket.io事件延迟加载其余注释。您可能需要一个服务器端处理程序,该处理程序以参数
updateId
,startIndex
,maxComments
,从给定索引开始返回给定更新的注释列表。如果结果以JSON的形式发送到客户端,那么在客户端上很容易执行以下操作:
// Assume `model` is an instance of `Update`.
socket.emit('get_comments_page', {
updateId: model.get('id'),
startIndex: 1,
maxComments: 10
}, function(err, data) {
if (err) {
alert('Unable to fetch comments: ', err);
} else {
model.get('messages').reset(data)
}
});
- 在获取
Update
然后尝试使用fetchRelated
解析注释时,避免发送所有注释的ID。我用艰苦的方式学会了这一点:哦/
- 您还可以直接将comments集合存储在视图上,而无需将其关联为
Update
第二季度:
我没有任何使用layoutmanager
管理视图的经验。木偶有一个(免责声明:我是共同维护者)。我鼓励您看看Marionette.async是如何延迟呈现的,等待数据从服务器到达
其主要思想是使用jquery的延迟对象,这些对象在数据从服务器返回时解析。将上述示例扩展为延迟:
var MyView = Backbone.View.extend({
// ... normal stuff that views need ...
initialize: function() {
var deferred = $.Deferred();
// Assume `model` is an instance of `Update`.
var that = this;
socket.emit('get_comments_page', {
updateId: that.model.get('id'),
startIndex: that.options.pageNumber,
maxComments: 10
}, function(err, data) {
if (err) {
alert('Unable to fetch comments: ', err);
} else {
that.model.get('messages').reset(data)
}
deferred.resolve();
});
this.promise = deferred.promise();
},
render: function() {
var that = this;
this.promise.done(function() {
// Do your normal rendering code here, for instance:
$(that.el).html(that.template(that.model.toJSON()));
});
return this;
}
});
注意:上面的代码片段未按原样进行测试