2017-02-26 56 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方法的回調中,反應變量var的範圍與模板的範圍相同。 – zim

+0

是它的一個咖啡腳本,是的它在相同的範圍內,但由於某種原因,DOM不會更新值 – SanjeevGhimire

+0

我會調試1)將console.log放入幫助程序中,查看它被調用的次數以及您擁有的值和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的服務器上實現,我會假設兩種情況:

  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的組合等。