2012-11-09 12 views
5

Meteorsテンプレートの動作を理解するのに手伝ってもらえますか?Meteor.jsテンプレートがデータなしでレンダリングされないようにする方法

AppleのGrowlと同様に、私のプロジェクトに通知システムを実装したいと思います。 レコードがデータベースに書き込まれるときに、簡単なjQueryエフェクトを使用してメッセージを表示させます。私は、本質的な問題を表示するには、コード例を簡素化しました:

コード:

var Messages = new Meteor.Collection("messages"); 

if (Meteor.isClient) { 
    Template.Notification.Message = function() { 
    return Message.findOne({}, {sort: {seq: -1}}); 
    }; 

    Template.Notification.rendered = function() { 
    $("#livebar").fadeIn(400).delay(1000).fadeOut(400); 
    } 
} 

テンプレート:

<template name="Notification"> 
<div class="row"> 
    <div class="span6 alert alert-error" id="livebar" style="display:none;"> 
     {{Messages.text}} 
    </div> 
</div> 
</template> 

ページが表示されている場合は、空の目に見えない領域がレンダリングされるとjQueryエフェクトを使用して、反応性のあるデータソース(Message)をロードし、再度領域をレンダリングします。 私はそれが2回レンダリングされないようにしようとしましたが、成功しませんでした。エラーは修正するのが非常に簡単だと思われますが、私はここで立ち往生しています。私はどんな助けもありがとう!

+0

template.templateName.createdとMeteor.deferを試してください – crapthings

答えて

3

テンプレートコール{{> Notification}}{{#if}}ブロックで囲むことができます。

{{#if has_notifications}} 
    {{> Notifications}} 
{{/if}} 

//JS 
Template.foo.has_notifications = function() { 
    Message.find().count() > 0; 
}  

しかし、データが到着すると、テンプレートが複数回レンダリングされる可能性があります。

まず、プロジェクト内の端末にmeteor remove autopublishを実行します。タイムアウトが...

+0

この回避策をありがとうございました!それはさらに簡単になり: \t '<テンプレート名= "通知"> \t \t {{メッセージの#if}} \t \t

\t \t {{/}場合}これは、テンプレートをレンダラー \t' のみデータソースがロードされた後 – dimkin

+1

'{{#if Messages}}'は、このように呼び出すことによって、Messages-collection内の要素の存在を確認するか、流行をチェックしますか? – Andreas

+1

あなたはそうです、私は 'メッセージ'を意味するのではなく、このテンプレートで既に利用可能だった 'Template.Notification.Message'ヘルパーを意味します。したがって、 '{{#if Message}}' – dimkin

3

あなたはこの余分なコードが必要ですが、あなたを助けることができます。

セカンド

//On isServer 
Meteor.publish('messages', function(){ 
    return Messages.find(); 
}); 

を公開するかを定義次に、そのデータをサブスクライブし、また

//On isClient 
subscription_handle = Meteor.subscribe('messages'); 

Meteor.autorun(function(computation) { 
    if(subscription_handle.ready()) { 

     //The data is now ready, start your templates here 

     computation.stop(); //Stop autorun 
    } 
}); 

その準備まで待って、そう VAR Messages = new Meteor.Collection("messages");そのグローバル変数としてあなたのコレクションを定義します。

アイロンルータでテンプレートルートのwaitOnプロパティを使用するのは全く違っていますが、データの準備が整った後でテンプレートがレンダリングされます。

+0

はい!サブスクリプションがレンダリングされる前に準備が整っていることを確認してください。命を救う人! – scald

関連する問題