使Meteor对Meteor.user()的特定子项具有反应性

时间:2015-04-20 16:42:35

标签: javascript mongodb meteor

我正在尝试做什么...

我需要使用存储在用户的Meteor.user()对象中的一些子属性,例如Meteor.user().profile.preferences.preference_oneMeteor.user().profile.preferences.preference_two等等。这些子属性正在反应式自动运行块中使用,因为重新计算必须在它们发生变化时进行。

我的问题是......

我发现当我从一个被动块中引用这些子属性的值时,会激活自动运行Meteor.user()对象的任何更改,包括更改不以任何方式影响我明确引用的数据。例如,如果更新Meteor.user().profile.name,那么包含Meteor.user().profile.preferences.preference_oneMeteor.user().profile.preferences.preference_two的任何自动运行也会被触发,因为它们都有一个共同的父级。

I have seen a similar question处理限制Meteor反应的范围,但它涉及自定义集合,而不是Meteor.users集合。我无法看到解决方案如何适用,因为他们在订阅中指定字段以限制发布到客户端的子属性,在我的情况下,我需要Meteor.user()的所有子属性。但我需要能够选择我正在做出反应的子属性!

在本地存储子属性值然后比较每个更改当然会有效,但它是一个强力的解决方案解决方案,因为它需要额外的逻辑,并且无论如何都会激活自动运行。

2 个答案:

答案 0 :(得分:7)

我不知道这是否是最佳方式,但请看一下这个例子:

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

答案 1 :(得分:1)

大卫的解决方案很棒(一如既往)。

为了提供一些变化,我建议将您的偏好(或整个配置文件)移动到自己的集合中。然后,使用.publish(null,...始终可以访问该集合。

任何一种解决方案都可以很好地工作,除了附加到关键users集合的登录凭据之外,我只是希望除此之外什么都没有。