收集MeteorJS的奇怪行为

时间:2015-12-11 22:06:32

标签: javascript meteor

我收集了一些简单的文档,例如{title:"some title", routes:{first:"sport",second:"football"}},并且有一些像

这样的类别
[{
  name: "sport",
  children: {[
     {
        name: "football",
     },
     {
        name: "basketball
     }
  ]}
},
{
  //....
}
///...
]

问题:当我切换beetwen 2路线时,如" / sport / football"和" / sport / basketball"我看到来自另一条路线的帖子就像这里一样:

1) "/sport/football"
   (I see)

  - post1
  - post2

2) go to "/sport/basketball"
   (for <1 second I see)

  - post1
  - post2
  - post3
  - post4

3)"/sport/basketball"
  (after <1 second I see)

  - post3
  - post4


 /// Code
 Template.third_level.onCreated(function(){
        var self = this;
        self.autorun(function() {
            var second_route = Session.get("current_route").params.name_second;
            var first_route = Session.get("current_route").params.name;;
            self.subscribe('posts_levels', first_route, second_route);
        });
    });

Template.third_level.helpers({
    third_level:function(){
        return Posts.find();
    },
});

<template name="third_level">
{{#if Template.subscriptionsReady}}
    {{#each third_level}}
        {{> third_category}}
    {{/each}}
{{/if}}
</template>

Tracker.autorun(function() {
    FlowRouter.watchPathChange();
    var currentContext = FlowRouter.current().path;
    Session.set("current_route",{
        path: currentContext,
        params: FlowRouter.current().params
    });
});

Meteor.publish("posts_levels", function(route_one, route_two){
    check(route_one , String);
    check(route_two , String);
    return Posts.find({
        routes: { $in : [{
            first: route_one,
            second: route_two
        }]}
    });
});

1 个答案:

答案 0 :(得分:1)

它的工作方式与设计相似

  1. 您本地收藏品有第1项和第2项
  2. 您更改了订阅,您的收藏仍然是1和2
  3. ddp会向您发送消息:{已添加:3},{已添加:4},{已删除:1},{已删除:2}
  4. 注意:DDP会为每个插入/删除/更新发送一条自己的消息,而不是单个消息!

    因此,不是假设和希望,您的集合只包含您需要的数据并通过Collection.find()显示整个集合,您应该在客户端上执行查询,因此您只显示您想要的内容.. < / p>

    所以而不是:

    third_level:function(){
        return Posts.find();
    },
    

    这样做

    third_level:function(){
        // get stuff from session, like in publication
        var first = Session.get // ..
        var second = Session.get // ..
    
        return Posts.find({routes: { $in : [{
            first: first,
            second: second
        }]}});
    },
    

    这样你只会看到你需要的物品,而且这个系列可以更新它的方式,没有奇怪的副作用。

    另一种解决方法: 让我们知道,在订阅准备好之后,您可以公开整个集合..确定这样做:

    third_level:function() {
        if (Template.instance().subscriptionsReady())
          return Posts.find();
    },
    

    这种方式只有在订阅准备就绪时才会返回,这意味着对于某些ms,您将查看为空!