Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/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
Node.js 主干网。关系、实时和处理大型数据_Node.js_Backbone.js_Socket.io_Backbone Relational - Fatal编程技术网

Node.js 主干网。关系、实时和处理大型数据

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模型

我正在使用Backbone.js、node.js和socket.io构建一个实时提要应用程序

我的
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;
      }
    });
    
    注意:上面的代码片段未按原样进行测试