对于第一季度:
- 我假设您使用ioSync 之类的东西在 Backbone.sync 中使用 socket.io 而不是 REST API 或类似的解决方案。
- 将元数据(例如评论数)作为属性包含在
Update
. 如果您的Update
对象本身很重,您可以使用ioBind和自定义服务器端 socket.io 事件来更新计数,而不是每次都发送整个对象。
- 将属性
topComment
作为附加的一对一关系包含在Update
. Update
最初从服务器加载时,包括topComment
在响应中,但不包括其他评论。
使用自定义 socket.io 事件延迟加载其余评论。您可能需要一个以 , , 为参数的服务器端处理程序updateId
,startIndex
它返回从给定索引开始的给maxComments
定注释列表。Update
如果结果以 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 。我很难学会这一点:O/
- 您还可以将评论集合直接存储在视图上,而无需将其关联为
Update
对于第二季度:
我没有任何经验,layoutmanager
因为我使用Backbone.Marionette来管理我的视图。Marionette 有一个异步扩展(免责声明:我是共同维护者)。我鼓励看看 Marionette.async 如何进行延迟渲染,等待数据从服务器到达。
主要思想是使用 jquery 的 Deferred 对象,当数据从服务器返回时解析。用 deferred 扩展上面的例子:
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;
}
});
注意:上面的代码片段未按原样测试。