gpt4 book ai didi

javascript - MeteorJS 集合的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 08:08:59 25 4
gpt4 key购买 nike

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

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

问题:当我在“/sport/football”和“/sport/basketball”等 2 条路线之间切换 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 }、{ linked: 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();
},

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

关于javascript - MeteorJS 集合的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com