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

mso*_*ers 1 javascript mongodb meteor

我正在尝试做什么......

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

我的问题是......

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

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

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

Dav*_*don 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);
});
Run Code Online (Sandbox Code Playgroud)

第一个autorun将在每次用户数据更改autorun时触发,但是第二个将仅在该特定属性更改时触发.