2017-02-26 7 views
0

私は流星のアプリケーションを作成しており、反応性機能を使用して、利用可能な、または更新されているときにdomの結果の自動更新を実装しています。 は、ここに私のコードスニペットです:meteor reactiveVarがhtmlの結果を更新しない

Template.message.helpers 
     profession: -> 
     return Template.instance().profession.get() 

    Template.message.onCreated -> 

    @profession = new ReactiveVar '' 

    msg = Template.currentData() 

    @userId = msg.u?._id 

    Tracker.autorun => 
     Meteor.call 'getLimitedUserData', {id:Template.instance().userId}, (error, result) => 
      if error 
       return handleError(error) 
      if result 
       @profession.set result.customFields.Profession 

DOM:私が間違って何を

{{#if profession}} 
     <span class="profession"><i>{{profession}}</i></span> 
    {{/if}} 

を行っているだろうか?職業は更新されません。しかし、それをコンソールに記録すると正しい値が表示されます。

ご協力いただきありがとうございます。

+0

はそのコーヒースクリプトですか?私はそれを知らないので、私は生成されたJSを見て、Meteorメソッドのコールバックの中で職業の反応変数の範囲がテンプレートの範囲と同じであることを確認します。 – zim

+0

はいコーヒースクリプトとはい、同じスコープ内にありますが、何らかの理由でDOMが値を更新しない – SanjeevGhimire

+0

私は1でデバッグします。コンソールに何度も呼び出され、何値があるかをヘルパーに表示します。 2)条件付きで動作しているかどうかを確認する場合は、テンプレートハードコーディングテキスト(ここでは「ここ!」)を入力します。 – zim

答えて

0

お客様のTracker.autorun()は、userId以外の反応データソースに依存しないため、決して実行されません。このテンプレートを開くときにすでにログインしている場合は、userIdは変更されません。

テンプレートのonCreatedハンドラでMeteor.call()を実行してから、(非同期に)返すとヘルパーが自動的に更新されます。

Template.message.helpers 
    profession: -> 
    return Template.instance().profession.get() 

Template.message.onCreated -> 
    @profession = new ReactiveVar '' 
    Meteor.call 'getLimitedUserData', {id:Template.instance().userId}, (error, result) => 
     if error 
     return handleError(error) 
     else 
     @profession.set result.customFields.Profession 

しかし:は、なぜあなたは、ユーザーに関する情報を取得するためにMeteor.call()を使用していますか?これは、通常、ユーザーコレクションのpub-subを通じて処理されます。これにより、反応パターンの更新やテンプレートパターンの簡素化のメリットが得られます。現在のユーザーに関する情報を表示するための反応変数は必要ありません。

0

我々は、サーバー上のgetLimitedUserDataの実装を知らないので、私は2つの状況を前提としたい:

  1. 「限定ユーザー・データを」バックエンドであなたのMongoDBからの限定されたデータの集合であり、代わりにMeteor.publishMeteor.subscribeを使用したいと考えています。

    // on the server 
    Meteor.publish('limitedUserData', function() { 
        return Meteor.users.find({ /* limits */ }); 
    }) 
    

    とブレイズコード:

    Template.message.onCreated(function() { 
        this.autorun(() => { 
        this.subscribe('limitedUserData') 
        }) 
    }) 
    
    Template.message.helpers({ 
        profession() { 
        return Meteor.users.find({ /* same limit */}).profession 
        } 
    }) 
    
  2. 「制限されたユーザーデータは、」少し複雑になり、外部サービスへのAPI呼び出しです。おそらく、DPPとsetIntervalなどの組み合わせを使用する必要があります。

関連する問題