2015-09-10 9 views
7

私は1つが反応性のある源であることを知っていますが、もう1つはそうではありません。しかし、私は彼らがいつも同じ価値を与えると思った。Template.currentData()とtemplate.dataの値はいつ異なっていますか?

は、その後、私は望遠鏡のソースに次のコードを見つけました:

var newTerms = Template.currentData().terms; // ⚡ reactive ⚡ 
    if (!_.isEqual(newTerms, instance.data.terms)) { 
     instance.postsLimit.set(instance.data.terms.limit || Settings.get('postsPerPage', 10)); 
    } 

リンク:https://github.com/TelescopeJS/Telescope/blob/master/packages/telescope-posts/lib/client/templates/posts_list/posts_list_controller.js#L33

だから、これら2つの値は時々異なることがありそうです。いつ?

答えて

8

流星のマニュアルによると、およそtemplate.data

このプロパティは、 テンプレートのトップレベルでデータコンテキストへのアクセスを提供します。 テンプレートが再レンダリングされるたびに更新されます。 アクセスは読み取り専用であり、ノンリアクティブです。

我々はthe current data context is reactiveは、それゆえ(反応性がすべての素敵を見て、ブレイズに滑らかにするものである)再レンダリングされているテンプレートなしに変更することができ、このif文は「本当の」現在のかどうかをチェックするために書かれていることを知っているので、 Template.currentData()に保存されている用語は、現在のテンプレートが最後にレンダリングされたときの「以前の」用語に比べて変更されています()。 、それを包むために

非反応template.dataに格納されている)何この自動実行がないことである:現在のデータコンテキストが変更さ

  1. いつ...
  2. から用語を取得したデータそれらが異なる場合は、テンプレートを
  3. をレンダリングしたときのコンテキスト
  4. template.dataに保存されているものにこれらの用語の比較、それは(当たり前)の用語が変更されている意味:ポストの制限をリセットします。あなたが二回、そのテンプレートを渡すたび

    {{> Template.dynamic template=template data=data}} // see posts_list_controller.html 
    

    :この反応変数は、それは用語が通じ、値の取得

    // initialize the reactive variables 
        instance.terms = new ReactiveVar(instance.data.terms); 
    

    :付きセクションがありonCreatedテンプレートでpost_list_controller.js以内

+1

なぜ、newTermsの前の値ではなく、 'newTerms'と' instance.data.terms'を比較しますか?ポストリミットは、条件が変更されてもテンプレートが再レンダリングされないときにリセットされ、次回データコンテキストが変更されたときに、条件が今回変更されなくてもポストリミットが再度リセットされます。これは私たちが欲しいものですか?私には不思議そうだ。 –

+0

また、テンプレート(UI)を再レンダリングせずに「更新」できることを意味しますか? (これまで、私はすべてのUIの変更が再レンダリングによって引き起こされたと考えていました。)これが当てはまる場合、再レンダリングは 'onCreated()'や 'onRendered()'のようなコールバックを引き起こすことはありませんか?ですから、ユーザーから見て、再レンダリングと「更新」の論理的な違いは何ですか?これは私の実装の詳細のように思えますし、最適化によって以前は再レンダリングが必要なものが "更新"だけ必要になることがあります。では、なぜ 'template.data'のようなAPIは実装の詳細に依存しますか? –

+1

あなたの最初の質問として:私の意見では、これはあなたが指摘している非常に正当な懸念です。このコードはかなり最近のものです[7月28日に作成されました](https://github.com/TelescopeJS/Telescope/commit/346f50d52bdcf6ec8f5a2c86587dd46d9fb83f80)。私はいくつかのフィードバックを得るためのコミットについてコメントしました。 – SylvainB

2

異なるデータセット(David Weldon - scoped-reactivity)、その反応変数が設定され、自動実行が実行されます。

// this part will cause the autorun to run 
var terms = Template.currentData().terms; // ⚡ reactive ⚡ 
関連する問題