繁体   English   中英

集合MeteorJS的奇怪行为

[英]Strange behavior of the collection MeteorJS

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

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

问题:当我将beetwen 2条路线(例如“ / sport / football”和“ / 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向您发送消息:{添加:3},{添加:4},{删除:1},{删除: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();
},

这样,您仅在订阅准备就绪时才返回,这意味着在某些情况下您查看的内容将为空!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM