簡體   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