在流星中使用订阅的正确方法

时间:2014-12-09 10:00:24

标签: meteor

在我的meteor应用程序中,我有所有需要从元素集合中加载一个或多个文档的页面以及一些从项目集合中加载文档的页面;

我有两个集合的两个发布函数,但现在我正在尝试理解订阅它们的最佳方式; 目前我正在/ client目录中的文件中订阅元素:

Meteor.subscribe("elements");

这将使应用程序的订阅开始;

在另一种情况下,由于要加载的项目多一点,我决定在铁路由器中使用订阅选项:

subscriptions: function() {
    return Meteor.subscribe("items");
}

我可以看到的第一个区别是,一旦启动应用程序,元素似乎不再需要时间来加载(浏览页面不需要时间加载); 另一方面,每当我打开加载项目的页面时(没有刷新的事件)都会再次加载加载时间;

可能不是在应用程序启动时订阅项目的最佳解决方案,因为只有在访问其特定路径时才需要它们(否则需要在任何地方使用元素); 但是每次我再次询问这条路线时,有办法避免从服务器重新加载它们吗?

同时考虑元素,并非所有页面都需要它们:avery页面只需要其中的一个或两个;所以加载一两个真正需要的东西可能会更加正确......

您认为应该如何管理订阅?

3 个答案:

答案 0 :(得分:1)

我在回答this question的答案中介绍了一些权衡。以下是我们如何使用subscriptions manager包在Edthena中执行此操作:

// Allow the subman to cache a lot of subscriptions for a very long time
var subman = new SubsManager({cacheLimit: 100, expireIn: 864000});

// This is a global subscription that we may need to wait on later
subman.subscribe('sub1');

// This is a global subscription that we don't need to wait on
Meteor.subscribe('sub2');

Tracker.autorun(function() {
  if (Meteor.userId()) {
    // Add subscriptions which should be loaded globally but only
    // after the user logs in.
    Meteor.subscribe('sub3');
  }
});

var PostController = RouteController.extend({
  waitOn: function() {
    // Use subman only if we want to cache the subscription between routes.
    // Note that in the case of sub1, the previous handle will be reused
    return [
      subman.subscribe('sub1'),
      subman.subscribe('sub4'),
      Meteor.subscribe('sub5')
    ];
  }
});

答案 1 :(得分:0)

这是一个偏好问题,但我认为最简单的答案是,您可以在集中订阅时使用Iron Router的订阅选项:

订阅文件:

Subscriptions = {
    elements: Meteor.subscribe('elements'),
    ...
};

路由器:

subscriptions: function() {
    return Subscriptions.elements;
}

所有路由器需求都是Meteor.subscribe返回的句柄,它实际上不必进行订阅。如果将这些句柄存储在(明确命名的)全局对象中,则可以在需要时将它们传递给相关的路由器函数。

答案 2 :(得分:0)

首先,安装IronRouter输入;在命令提示符下,输入“meteor add iron:router”;这样做会添加该路由包。

因此,您的“原始”或基本URL不会引发路由异常,请将其添加到.js文件的顶部(“isClient”和“isService”块之上/之外):

Router.route('/');

在项目的.html文件中添加一个或两个(或更多)模板(你可以使用Notepad或Notepad ++,但我推荐Github的免费(和“hackable”)Atom编辑器和Meteor助手包添加。当您输入“meteor create”命令时,项目将位于您所处文件夹的子文件夹中。要下载Atom编辑器,请单击此处。

BTW,Atom编辑网站上的未来派/牧师编码家族的视频是天然气,男人!

返回添加模板;例如,这里有一些我添加的模板:

<template name="garrapatabeach"><p>Here&#39;s a picture of Garrapata Beach; early morning; 
    long exposure.</p>
<p class="location">Garrapata Beach.Garrapata State Park.Big Sur.Monterey County.California</p>
  <img height="600" src="/images/garrapataBeach.jpg" width="900" />
</template>

<template name="garrapataturnout"><p>Here&#39;s a picture from the first Garrapata turnout; 
    long exposure</p>
<p class="location">First Turnout.Garrapata State Park.Big Sur.Monterey County.California</p>
  <img height="600" src="/images/GarrapataTurnout1.jpg" width="900" />
</template>

现在,在项目的.js文件的同一部分中添加路径,在.js文件中添加“home”(“/”)路由,这样它就像这样(路由匹配模板名称):

Router.route('/');
Router.route('/garrapatabeach');
Router.route('/garrapataturnout');

注意:这假设您已在项目中添加了“public”文件夹,并在其下方添加了“images”文件夹,并且您拥有该图像文件夹中指示名称的图像。如果您想“一起玩”,可以从dplatypus.meteor.com/garrapatabeach和dplatypus.meteor.com/garrapataturnout下载这些图像;否则,只需更改jpgs的名称并使用您自己的图像。

现在,您可以通过导航到上面给出的链接来查看模板(要运行它,只需在项目文件夹中的命令提示符下输入“meteor”,然后导航到localhost:3000)。然而,为了使它“更好”(以便主页不像裸鸟一样裸露),我们将在主模板中放置一些锚标签/链接,如下所示:

<body>
  {{> main}}
</body>

<template name="main">
  <a href="garrapatabeach" target="_blank">Garrapata Beach</a>
  <a href="garrapataturnout" target="_blank">Garrapata Turnout</a>
</template>

现在导航到localhost:3000时会显示链接,点击它们会将您引导至相应的页面/模板。要继续,只需添加另一个模板,以及相应的路由条目和锚标记/链接。