8

例:

ブログ投稿のリストを扱う Meteor アプリを作成しています。すべてのブログ投稿は、「投稿」というコレクションに保存されます。ルーティングには Iron Router を使用しています。

特定の作成者によって作成されたすべての投稿のリストをユーザーに表示したいと考えています。このリストは、スペースバーを使用して表示されます。したがって、テンプレートにデータを提供する必要があります。

問題:

私の知る限り、これを行うには2つの方法があります。

  1. テンプレート ヘルパーの使用
  2. ルートの「データ」プロパティを使用する

オプション 1 の例:

Template.postList.helpers({
postsToDisplay: function(){
    return Posts.find({author: 'someAuthor'});
}
})

オプション 2 の例:

//Inside my route
data: function(){
    return {postsToDisplay: Posts.find({author: 'someAuthor'})};
}

質問

これら2つの方法に大きな違いはありますか? どちらかを優先する理由はありますか?より良いパフォーマンスを提供しますか?

回答ありがとうございます。

4

1 に答える 1

7

これら2つの方法に大きな違いはありますか? より良いパフォーマンスを提供しますか?

そうではなく、結局のところ、それは単なるデザインの選択です。

どちらかを優先する理由はありますか?

私は Iron-router + data メソッドに固執します。理由は次のとおりです。

  • サーバーからフェッチされたデータの準備ができたときにのみ、waitOn を使用してリストを実際に表示できます。loadingTemplate を使用するRouter.onBeforeAction("loading")と、全体的なユーザー エクスペリエンスが向上します。

  • さまざまなコンテキストでフィードできる、データに依存しない postsList テンプレートを設計できます。

最後のポイントは、最近の投稿のリスト、カテゴリ内の投稿のリスト、特定の作成者による投稿のリストを表示するために使用できる再利用可能なテンプレートを定義できるため、特に興味深いものです。 1位など…

<template name="postsList">
  {{#each posts}}
    {{> postListItem}}
  {{/each}}
</template>

ここで、postsList のヘルパーとして投稿を定義することもできますが、postsList を呼び出す親テンプレートに必要な投稿を割り当てさせる方がよいでしょう。

template:"postsList",
data:function(){
  return {
    posts:Posts.find({
      "author":this.params.author
    })
  };
}

この設計パターンにより、特定の作成者による投稿のリストを表すデータ コンテキストを提供するルートを定義できますが、カテゴリ別に投稿を一覧表示するデータ コンテキストを提供する別のルートを定義することもできます。

したがって、データ プロバイダーの役割をテンプレート ヘルパーからルート定義に移動することで、はるかに再利用可能なテンプレートが得られます。これは素晴らしいことです。

于 2014-08-19T14:00:33.410 に答える