6

メインコンテンツが動的サイドバーにあるレイアウトを実装しました。以下を定義しましたlayoutTemplate

<template name="layout">
  {{> content}}

  {{> leftbar}}

  {{> rightbar}}

  <nav class="navigation">
      {{#if currentUser}}
          {{> navigation_logged_in}}
      {{else}}
          {{> navigation_logged_out}}
      {{/if}}
  </nav>
</template>

たとえば、レイアウト テンプレートに rightbar テンプレートを含めます。

<template name="rightbar">
  <aside class="rightbar">
      <button id="closeRightBar" class="close-cross"></button>

      {{yield 'rightbar'}}
  </aside>
</template>

rightbar テンプレートには、特定のコンテンツを生成する rightbar yield が含まれています。

次の RouteController を実装しました。

UserShowRouter = RouteController.extend({

  before: function() {
      var username = this.params.username;
      if(App.subs.user) {
          App.subs.user.stop();
      }
      App.subs.user = Meteor.subscribe('user', username);
  },

  waitOn: function () {
    return Meteor.subscribe('user');
  },

  data: function() {
      return Meteor.users.findOne({'profile.username': this.params.username});
  },

  action: function() {
      this.render('profile', {to: 'rightbar'});
  }

});

私たちが達成したかったのは、たとえば、profileテンプレートがrightbaryieldに生成され、データの変更に応じて更新および再レンダリングされることです。

問題は、サイドバーが動的にアニメーション化され、表示され、非表示になることです。profileテンプレートが再レンダリングされるたびに、テンプレートlayout再レンダリングされます。何故ですか?イールド リージョンの目的の 1 つは、サイト全体を再レンダリングする必要がないことだと考えました。レイアウトが再レンダリングされると、アニメーションの css 全体が元の値に戻されます。

現在、いくつかの異なるアプローチを試しましたが、どれも適切でクリーンなソリューションではないようです。layoutテンプレートが再レンダリングされないようにして、yield リージョンとテンプレートを最新の状態に保つ方法はありますか? 任意の提案や代替案をいただければ幸いです。

4

2 に答える 2

3

私が理解しているように、テンプレートの再レンダリングが「泡立ち」、親テンプレートの再レンダリングを引き起こす動作は、iron-router やコードの実装方法に固有のものではなく、Spark に固有のものです。ドキュメントからわかる限り、Iron-router の {{yield}} パターンはこの動作を変更しません。

良いニュースは、Spark が、現在 "Spacebars" というコードネームが付けられている、より新しい、よりきめ細かいレンダリング エンジンに間もなく置き換えられるように設定されていることです。

以下は、新しいレンダリング システムのプレビューです。

https://github.com/meteor/meteor/wiki/New-Template-Engine-Preview

1 週間前のこの講演では、新しいレンダリング エンジンによるメリットについても説明しています (かなり長いですが、概要は最初の 5 分で説明されています)。

https://www.youtube.com/watch?v=aPf0LMQHIqk

現在のオプションとして、次のことができます。

a) {{#constant}} および {{#isolate}} パラメータを使用して、再レンダリングを制限しようとします。

b) 上記のリンクで説明されているように、開発ブランチから作業します。

template-engine-preview-4 リリース タグを使用するか (meteor --release template-engine-preview-4 でアプリを実行します)、またはサメをチェックアウトすることで、現在進行中のバージョンのコードを試すことができます。ブランチ (これは内部コードネームです)。

c) プロジェクトの時間枠が許せば、Meteor 1.0 がヒットし、「スペースバー」がメイン ブランチに常駐するまで再レンダリングを続行できるようにするのが最善です。これは 1 ~ 3 か月先のようです。

于 2013-11-11T17:09:52.050 に答える