1

新しく開発中のフレームワークを使用する際の課題の 1 つは、Web で見つけたアドバイスが古くなっていることが多いことです。これは、SO の回答と Web 記事が 1.0.x より前のバージョンまたは 1.0.x の初期のバージョン、または以前のバージョンの Iron-router、または先週機能を導入する前のバージョンであることが多い Meteor に二重に適用されます。 .

サブスクリプションの準備が整うまでテンプレートを待機させるというコンテキストで subscriptionsReady() 関数を使用する方法については、まだ困惑しています。私のテンプレートは約 3/4 の時間でデータなしでレンダリングしようとするので、確かに必要です。

subscriptionsReady() の使用方法 私はそれをHTMLで使用する例を見てきましたが、これはちょっとばかげていると思います(ファジングプレゼンテーションと機能)。テンプレートのコード部分で使用するにはどうすればよいですか?

ある種のwaitOnを備えたアイアンルーターで使用されていますか? テンプレートレンダラーでwhileループでラップしますか? 簡単な例を教えてください。

義務的なコードのもの...私のテンプレートの私のルート:

Router.route('/', {
  path: '/',
  template: 'navmenu',
  onBeforeAction: function() {
    this.next();
  }
});

私のサブスクリプション:

// Chapters
ChapterCollection = new Mongo.Collection("ChapterCollection");

if(Meteor.isClient){

    Meteor.subscribe('users');
    Meteor.subscribe('roles');
    Meteor.subscribe('ChapterCollection');
}

html 部分は非常に単純で、一部の HTML がテンプレート タグでラップされています。

私のテンプレートコード:

Template.navmenu.rendered = function() {

    // Load all chapters from collections
    // Unless it decides to delay and then we are *%&@ed
    chapterArray = ChapterCollection.find().fetch();

    ... other stuff ...
}

助けてくれてありがとう。

4

2 に答える 2

4

Iron ルーターの方法:

Router.route('/', {
  name: 'nameOfRoute',

  waitOn: function () {
   // we will wait for these subsciptions
    return [Meteor.subscribe('users'), Meteor.subscribe('roles'), Meteor.subscribe('ChapterCollection')]
  },

  action: function () {
  // this.ready() is true if all items in the wait list are ready
    if (this.ready()) {
        this.render('yourTemplate');
    }
    else {
        // if not ready, you can render another template in the meantime.
        this.render('Loading');
        }
    }
});

関数内で、actionテンプレート ヘルパーを作成することもできます。たとえば、waitOn関数内のサブスクリプションの 1 つが というコレクションからドキュメントを返す場合、呼び出されChapterCollectionたヘルパーはhelperAこのデータをテンプレートに渡します。

if (this.ready()) {
    this.render('yourTemplate', { data: {helperA: ChapterCollection.find()} });
}

html:

<template name="yourTemplate">
 //use the #each or #with block with respect to the data being returned. E.g
  {{#each helperA}}
    {{fieldName}}
  {{/each}}
</template>

流星の方法:

onCreated コールバックからthis.subscribeを使用 して、このテンプレートが依存するデータ パブリケーションを指定できます。

ステップ1:

簡単なステップバイステップの説明: テンプレートが作成されると、これらのサブスクリプションが呼び出されます。これは、ステップ 2 のテンプレートで行っていることです。サブスクリプションの準備が整うまで、「コンテンツ」がレンダリングされないようにします。

Template.yourtemplate.onCreated(function () {
  this.subscribe("users");
  this.subscribe("roles");
  this.subscribe("ChapterCollection");
});

ステップ2:

<template name="yourTemplate">

    {{#if Template.subscriptionsReady}}

    // all of the template contents here will be rendered ONLY when the subscriptions within the onCreated callbacks are ready.

    {{else}}

    // if subsciption is not ready, you may show something else here. E.g. "Loading...."

    {{/if}}

</template>
于 2015-05-20T11:05:02.560 に答える
0

Iron Router でサブスクリプションを待機するための waitOn メソッドがあります。

Router.route('/', {
  name: 'navmenu',
  waitOn: function() {
    return [
      Meteor.subscribe('users');
      Meteor.subscribe('roles');
      Meteor.subscribe('ChapterCollection');
    ];
  },
  onBeforeAction: function() {
    this.next();
  }
});

したがって、クライアント側のコードでサブスクリプションを削除できます。

また、「テンプレート」オプションは「名前」にする必要があります。Iron Router のドキュメントを読んでください。

于 2015-04-22T07:23:18.720 に答える