1

嗨,流星朋友们!

请注意:我使用的是汤姆的路由器

所以我试图只在 mongo 集合准备好时显示我的模板,但由于某种原因它不起作用!:(

我首先关注了这个帖子:LINK

所以我在 server.js 中有我的发布函数,我在我的路由器中订阅了这些函数,所以这里没有涉及到 Deps.autorun() (顺便说一句:这是正确的方法吗?Deps.autorun() 对我不起作用):

所以我有类似的东西:

'/myroute': function(bar) {
Meteor.subscribe("myCollection", bar, function() {
        Session.set('stuffLoaded', true);
    });
    return 'stuffPage';
}

在显示从“myCollection”加载的数据的模板中,我将有如下内容:

<template name="stuffPage">
    {{#if stuffLoaded}}
        <!-- Show the stuff from the collection -->
    {{else}}
        <p>loading!</p>
    {{/if}}
</template>

出于某种原因“加载!” 从不显示。此外,在几毫秒内,将显示上次显示相同模板时的“旧数据”(但为发布功能提供了另一个“条形”值 --> 不同的数据)。

这当然不好,因为用户可以在几毫秒内看到旧数据,然后突然出现新数据。为了避免这种“闪光”,我想显示“正在加载!” 直到新数据再次加载:这对我不起作用!:-(

我究竟做错了什么?

提前感谢您的帮助!

编辑:

好的,@user728291 提供的第一篇文章中的答案问题如下:

由于某种原因,路由器的东西在 Deps.autorun() 之后被调用......这里有什么问题?:( (请注意:eventsLoaded == stuffLoaded。)你们把你的 Deps.autorun() 放在哪里订阅或者换句话说:你的代码模型是什么?

我的控制台.log

实际上,我真的认为我的代码模型完全是错误的。那么如何根据路由(或者换句话说:基于当前显示的模板)进行不同的订阅?

AND:你把 Deps.autorun() 放在哪里?在 router.add() 函数内部?还是就在 (Meteor.isClient) 内部?

4

3 回答 3

2

我认为@user728291 的答案很准确,我只想补充一点,它Meteor.subscribe返回一个句柄,您可以使用它来检查准备情况:

保留对句柄的引用

Deps.autorun(function() {
  stuffHandle = Meteor.subscribe(Session.get('bar'));
});

然后在您的模板中检查它:

{{#if stuffHandle.ready}}
  ...
{{/if}}

Template.barTemplate.helpers({stuffHandle: stuffHandle});

并通过会话控制它:

'/myroute': function(bar) {
   Session.set('bar', bar);
   return 'barTemplate';
 }
于 2013-08-07T01:14:43.120 回答
2

最好将订阅放在 Deps.autorun 中并使用 Session 变量从路由器传递参数。此外,请确保您在订阅运行之前设置stuffLoaded为。false否则,它只会保持其旧值。

'/myroute': function(bar) {
  if ( ! Session.equals( "bar", bar ) ) {
      Session.set( "stuffLoaded", false);  //subscription needs to be run
      Session.set( "bar", bar );  // this change will trigger Dep.autorun     
  }
  return 'stuffPage';
}

Deps.autorun ( function (){
  Meteor.subscribe("myCollection", Session.get( "bar" ), function() {
    Session.set("stuffLoaded", true);
  });
});

如果您在第一次加载页面时没有得到您想要的东西,您可能需要一些初始默认值作为 Session 变量。

于 2013-08-07T00:21:51.780 回答
0

首先,您可能缺少回调的实际函数名称,如本文所示

Meteor.subscribe("myCollection", bar, function onComplete() {
    Session.set('stuffLoaded', true);
});

这似乎是一个很好的练习。使用这种方法,我通常不会错过任何一个节拍。

其次,我不确定路由内的订阅是否运作良好?我宁愿做以下事情:

'/myroute': function(bar) {
    Session.set("myCollectionParam", bar)
    return 'stuffPage';
}

那么订阅最终看起来像这样:

 Meteor.subscribe("myCollection", Session.get("myCollectionParam"), function onComplete() {
    Session.set('stuffLoaded', true);
 });

或者(不确定哪个适合您,具体取决于您的发布功能):

 Meteor.subscribe("myCollection", {bar: Session.get("myCollectionParam")}, function onComplete() {
    Session.set('stuffLoaded', true);
 });

祝你好运!

编辑

只提一下发布功能:

虽然 Session.get("myCollectionParam") 可以返回 null,但您可以通过使用以下发布方法进一步确保行为:

Meteor.publish("myCollection", function(myCollectionParam) {
   check(myCollectionParam, String); 
   return MyCollection.find({_id: myCollectionParam});
});
于 2013-08-06T23:43:09.527 回答