MeteorJS集合的奇怪行为

Strange behavior of the collection MeteorJS

本文关键字:集合 MeteorJS      更新时间:2023-09-26

我收集了像{title:"some title", routes:{first:"sport",second:"football"}}这样的简单文档,并有一些像这样的类别

[{
  name: "sport",
  children: {[
     {
        name: "football",
     },
     {
        name: "basketball
     }
  ]}
},
{
  //....
}
///...
]

问题:当我切换甜菜文2条路线,如"/sport/足球"answers"/sport/basketball"1秒钟时,我会看到来自另一条路线的帖子,如这里:

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. 您的本地收藏有项目1和2
  2. 更改订阅后,您的收藏仍有1和2
  3. ddp会向您发送消息:{added:3}、{added:4}、{removed:1}和{removed:2}

注意:DDP为每次插入/删除/更新发送一条自己的消息,而不是作为一条消息

因此,与其假设和希望您的集合只有您需要的数据,并通过Collection.find()显示整个集合,不如在客户端上执行查询,这样您只显示您想要的内容。。

所以不是:

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,您查看的内容将为空!