Meteor Pub / Sub和Infinite Scroll挑战

时间:2016-11-02 15:44:22

标签: javascript mongodb meteor schema

让我们说我有一个Todos应用程序,有两个新的"高级"特性:

  1. 标签,允许用户通过为其提供一个或多个标签来组织待办事项。
  2. 儿童待机,允许我在其他待办事项(父母/子女关系)下移动正常待办事项
  3. 在我们的高级Todos应用中,有一个包含2列的视图 - 每列代表一个"标签" (我们会说" Bug"和"故事")。

    每列显示与列标签匹配的所有待办事项。为此,我们订阅了列标签中传递的每一列和一个限制(我们说10)以启用无限滚动。

    服务器沿着以下行返回光标:

    // Return all Todos matching passed label that are "Top-level"
    // Todos (e.g. they are a parent, not a child).
    // The "todo.parent" field is the string _id of another todo.
    return Todos.find({ labels: label, parent: { $exists: false } }, { limit });
    

    在滚动底部,我们增加限制并更新订阅。

    这很好用,非常简单。很酷!

    我们现在有一个要求,我们想要展示" Child"如果列中的父级,则在列中进行待办事项。例如,如果我们有2个Todos:

    todo1 = {
      title: "Re-style login screen",
      labels: ["Story"]
    };
    
    todo2 = {
      title: "Fix email validation",
      labels: ["Bug"],
      parent: todo1._id
    };
    

    然后我们想要"故事"列显示todo1和" Bug"列显示todo2。

    为了达到这个目的,根据我们当前的数据模型,我们希望服务器只返回"顶级"的Todos,它们现在由以下条件定义:

    Todos不是儿童&& Todos的父母与列标签不匹配

    因此服务器发布(使用Publish Composite)如下所示:

      return {
        find() {
          return Todos.find({ labels: label },{ limit });
        },
        children: [
          {
            find(childTodo) {
              if (childTodo.parent) {
                return Todos.find({ _id: childTodo.parent });
              }
            },
          },
        ],
      };
    

    注意:我们在本出版物中返回todo.parent doc,以便在客户端上我们不会在列中显示子Todo(如果父级在同一列中)。这是由我们的"限制"引起的问题。在父母面前返回孩子。

    此解决方案在大多数情况下都可以正常工作......

    我们开始遇到问题,当出版物返回9个孩子Todos(我们说标签" Bug")和1个父Todo(也标签" Bug" )。这意味着在我们的" Bug"列,只显示1个项目(父项)。

    1 Todo显示与我们从服务器预期的限制不符。

    我们可以等待订阅准备就绪,检查我们选择呈现的金额是否与我们的"真实"限制,然后增加限制,如果它没有。但在这一点上,对于我们的目标,整个事情似乎过于复杂。

    您可以在这里想到更好的发布/订阅模型来解决此问题吗?是否对数据模型进行了调整,可以在不需要大量增加数据库写入的情况下提高复杂性?

0 个答案:

没有答案