簡體   English   中英

使Meteor對Meteor.user()的特定子項目具有反應性

[英]Make Meteor Reactive to Specific Subitem of Meteor.user()

我要做什么...

我需要使用一些存儲在用戶的Meteor.user()對象中的子屬性,例如Meteor.user().profile.preferences.preference_oneMeteor.user().profile.preferences.preference_two等。 這些子屬性在反應式自動運行塊中使用,因為每次更改它們時都必須進行重新計算。

我的問題是...

我發現,當我從反應式塊中引用這些子屬性的值時,將對Meteor.user()對象的任何更改Meteor.user()包括不會以任何方式影響我的數據的更改Meteor.user()觸發自動運行是顯式引用。 例如,如果更新了Meteor.user().profile.name ,那么包含Meteor.user().profile.preferences.preference_oneMeteor.user().profile.preferences.preference_two任何自動運行Meteor.user().profile.preferences.preference_one被觸發,因為他們都有共同的父母。

我已經看到了一個類似的問題,涉及限制Meteor的反應性范圍,但是它涉及的是自定義集合,而不是Meteor.users集合。 我看不到那里的解決方案如何適用,因為它們在訂閱中指定字段以限制將哪些子屬性發布到客戶端,在我的情況下,我需要Meteor.user()所有子屬性。 但是我需要能夠選擇要響應的子屬性!

當然,將子屬性值存儲在本地,然后對每個更改進行比較當然是可行的,但這是一個蠻力解決方案,因為它需要額外的邏輯,並且無論如何都將自動運行。

我不知道這是否是最好的方法,但請看以下示例:

Tracker.autorun(function() {
  var user = Meteor.user();
  if (user && user.profile)
    Session.set('p1', user.profile.preference1);
});

Tracker.autorun(function() {
  var p1 = Session.get('p1');
  console.log("p1 is " + p1);
});

每次用戶數據更改時,都會觸發第一個autorun ,但是僅當該特定屬性更改時,才會觸發第二個autorun

大衛的解決方案很棒(一如既往)。

為了提供一些變化,我建議將您的首選項(或整個darn配置文件)移至其自己的集合。 然后,使用.publish(null,...來始終可以訪問該集合。

兩種解決方案都可以很好地工作,只是我偏愛除關鍵users集合上附加的登錄憑據外,什么都不要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM