【问题标题】:right way to use subscriptions in meteor在流星中使用订阅的正确方法
【发布时间】:2015-11-15 13:39:46
【问题描述】:

在我的流星应用程序中,我的所有页面都需要从元素集合中加载一个或多个文档,还有几个页面需要从项目集合中加载文档;

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

Meteor.subscribe("elements");

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

另外一种情况,由于要加载的项目有点多,所以我决定使用 Iron router 中的订阅选项:

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

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

可能不是在应用程序启动时订阅项目的最佳解决方案,因为只有在您访问其特定路线时才需要它们(否则到处都需要元素); 但是有一种方法可以避免每次我再次询问路由时从服务器重新加载它们?

还要考虑元素,并不是所有页面都需要它们:每个页面只需要其中的一两个;所以只加载真正需要的一两个可能会更正确......

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

【问题讨论】:

    标签: meteor


    【解决方案1】:

    我在对this question 的回答中介绍了一些权衡取舍。以下是我们在 Edthena 使用 subscriptions manager 包的方法:

    // 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')
        ];
      }
    });
    

    【讨论】:

      【解决方案2】:

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

      订阅文件:

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

      路由器:

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

      路由器需要的只是Meteor.subscribe返回的句柄,它实际上并不需要订阅。如果您将这些句柄存储在(合理命名的)全局对象中,则可以在需要时将它们传递给相关的路由器函数。

      【讨论】:

        【解决方案3】:

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

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

        Router.route('/');
        

        在项目的 .html 文件中添加一个或两个(或更多)模板(您可以为此使用 Notepad 或 Notepad++,但我推荐来自 Github 的免费(和“可破解”)Atom 编辑器,带有 Meteor 帮助程序包已添加。该项目将位于您输入“meteor create”命令时所在文件夹的子文件夹中。要下载 Atom 编辑器,请单击此按钮。

        顺便说一句,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');
        

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

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

        <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 时,链接将显示,单击它们会将您引导到相应的页面/模板。要继续,只需添加另一个模板,以及相应的路由条目和锚标记/链接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-17
          • 2012-10-01
          • 2020-08-20
          • 1970-01-01
          • 2014-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多