我需要使用存储在用户的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
的任何自动运行也会被触发,因为它们都有一个共同的父级。
I have seen a similar question处理限制Meteor反应的范围,但它涉及自定义集合,而不是Meteor.users
集合。我无法看到解决方案如何适用,因为他们在订阅中指定字段以限制发布到客户端的子属性,在我的情况下,我需要Meteor.user()
的所有子属性。但我需要能够选择我正在做出反应的子属性!
在本地存储子属性值然后比较每个更改当然会有效,但它是一个强力的解决方案解决方案,因为它需要额外的逻辑,并且无论如何都会激活自动运行。
答案 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
集合的登录凭据之外,我只是希望除此之外什么都没有。