Displaying loader while meteor collection loads

前端 未结 3 1016
旧巷少年郎
旧巷少年郎 2020-11-29 03:57

I have a template, task_list, that looks like this:

{{#each tasks}}
    {{> task}}
{{/each}}

Template.task_list.tasks

相关标签:
3条回答
  • 2020-11-29 04:10

    There have been some nice packages released in the meantime. Check out these two:

    1. Spin - displays a spinning wheel. With Iron Router, you can specify a loading template which shows the spinning wheel.
    2. Iron Router Progress - shows a progress bar on the top of the page (Youtube style)

    They both work pretty much out of the box, have a look at their documentation for more advanced options.

    0 讨论(0)
  • 2020-11-29 04:12

    Meteor 1.0.4 update: Now that template-level subscriptions are available and the preferred pattern to using iron:router or standalone subscriptions,

    There is a complementary function Template.instance().subscriptionsReady() which returns true when all of the subscriptions called with this.subscribe are ready.

    Inside the template's HTML, you can use the built-in helper Template.subscriptionsReady, which is an easy pattern for showing loading indicators in your templates when they depend on data loaded from subscriptions.

    Example:

    Template.notifications.onCreated(function () {
      // Use this.subscribe inside onCreated callback
      this.subscribe("notifications");
    });
    <template name="notifications">
      {{#if Template.subscriptionsReady}}
        <!-- This is displayed when all data is ready. -->
        {{#each notifications}}
          {{> notification}}
        {{/each}}
      {{else}}
        Loading...
      {{/if}}
    </template>
    

    This is better than having a generic loading template for the whole page, because the loading section is localized to the part of the page that actually has new data.


    Pre-Meteor 1.0.4:

    The idea is to pass an onReady function to Meteor.subscribe:

    Meteor.subscribe('tasks', function onReady() {
      Session.set('tasksLoaded', true);
    });
    

    Then, make your template depend on the tasksLoaded session variable. In the client JavaScript:

    Template.task_list.helpers({
      tasksLoaded: function () {
        return Session.get('tasksLoaded');
      }
    });
    

    In your template:

    <template name="task_list">
      {{#if tasksLoaded}}
        {{#each tasks}}
          {{> task}}
        {{/each}}
      {{else}}
        <img src="http://viewvc.svn.mozilla.org/vc/addons/trunk/bandwagon/skin/images/spinner.gif?revision=18591&view=co&pathrev=18591">
      {{/if}}
    

    UPDATE: With iron-router you have a direct option to specify a loading template which will be displayed while the subscription is loading.

    0 讨论(0)
  • 2020-11-29 04:15

    Dan's answer was definitely spot on, but I want to remind that I belive autopublish package has to be removed for it to actually work.

    meteor remove autopublish
    

    Plus, I recommend spin package for a nice looking spinner.

    0 讨论(0)
提交回复
热议问题