Javascript 使Meteor对Meteor.user()的特定子项产生反应 我想做的是。。。

Javascript 使Meteor对Meteor.user()的特定子项产生反应 我想做的是。。。,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我需要使用一些存储在用户的Meteor.user()对象中的子属性,例如Meteor.user().profile.preferences.preference\u one,Meteor.user().profile.preferences.preference\u two,等等。这些子属性在反应式自动运行块中使用,因为在它们更改时必须进行重新计算 我的问题是。。。 我发现,当我从一个反应块中引用这些子属性的值时,会对Meteor.user()对象的任何更改触发自动运行,包括不会以任何方式影响我

我需要使用一些存储在用户的
Meteor.user()
对象中的子属性,例如
Meteor.user().profile.preferences.preference\u one
Meteor.user().profile.preferences.preference\u two
,等等。这些子属性在反应式自动运行块中使用,因为在它们更改时必须进行重新计算

我的问题是。。。 我发现,当我从一个反应块中引用这些子属性的值时,会对
Meteor.user()
对象的任何更改触发自动运行,包括不会以任何方式影响我显式引用的数据的更改。例如,如果更新了
Meteor.user().profile.name
,则包含
Meteor.user().profile.preferences.preferences\u one
Meteor.user().profile.preferences.preferences\u two
的任何自动运行也会被触发,因为它们都有一个共同的父级

处理限制Meteor的反应范围的问题,但它处理的是定制的集合,而不是
Meteor.users
集合。我看不出解决方案如何适用,因为他们在订阅中指定字段以限制向客户端发布的子属性,在我的情况下,我需要
Meteor.user()的所有子属性。但我需要能够选择对哪些子属性做出反应


当然,在本地存储子属性值,然后在每次更改时进行比较是可行的,但这是一种蛮力解决方案,因为它需要额外的逻辑,而且自动运行程序无论如何都会启动。

我不知道这是否是最好的方法,但看看这个示例:

Tracker.autorun(函数(){
var user=Meteor.user();
if(用户和用户配置文件)
Session.set('p1',user.profile.preference1);
});
Tracker.autorun(函数(){
var p1=Session.get('p1');
控制台日志(“p1为”+p1);
});

第一个
自动运行
将在每次用户数据更改时启动,而第二个
自动运行
将仅在特定属性更改时启动。

我不知道这是否是最佳方式,但看看这个示例:

Tracker.autorun(函数(){
var user=Meteor.user();
if(用户和用户配置文件)
Session.set('p1',user.profile.preference1);
});
Tracker.autorun(函数(){
var p1=Session.get('p1');
控制台日志(“p1为”+p1);
});
第一个
自动运行
将在每次用户数据更改时启动,而第二个
自动运行
将仅在特定属性更改时启动。

David的解决方案非常好(一如既往)

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

无论哪种解决方案都会很好,我只希望在关键的
用户
集合中附加登录凭据。David的解决方案很好(一如既往)

为了提供一些多样性,我建议将您的首选项(或整个darn配置文件)移动到它自己的集合中。然后,使用
.publish(null,
)始终访问该集合


无论哪种解决方案都会很好,我只希望在关键的
用户
集合上附加登录凭据。我同意,这比我比较更改时的值的原始方法要好。从概念上讲,它做的过滤与按字段发布的过滤相同。我喜欢它。我喜欢它ree,这比我比较更改时的值的初始方法要好。它在概念上做的过滤与按字段发布的过滤相同。我喜欢它。更严重的是,我仍然不确定这是否真的解决了问题,因为我确实需要发布所有用户属性,并且我不能在没有您的情况下指定投影字段不要丢失其中的一些。无论我是从哪个集合发布的,这都是真的。哈哈,很好,我不确定我是否遵循了。你已经让用户自动发布了一个安全子集,然后你为给定的用户自动发布了一个
首选项
集合。该文档看起来像:
{user:'123',p1:'apples',p2:'vanilla'}
。然后,DDP发送更改的唯一时间是
p1
p2
更改时。或者您可能会发疯,每个用户首选项都有一个文档
{user:'123',prefName:'What flavor',prefVal:'Vanilla Moly'}
,尽管我称之为“过火”。在我看来,将用户信息放在用户文档中似乎是最快的解决方案。我更希望有一个倾向于这种模式的解决方案。我的动机是我有多个偏好参数,这些参数将且必须独立变化。有足够的参数满足用户数量的要求d文档有点傻,使用会话变量自动更新单个跟踪程序中的一个文档似乎更符合逻辑。我还有一个动机,那就是会话变量比发布/订阅更容易跨不同上下文管理。当然,我认为最流行的解决方案是reac当块中引用的特定属性实际上是被更改的属性时,激活变量仅触发其反应性父块。我同意这个答案是一个解决方案,但对于像我这样的多参数系统来说,它的可维护性比会话变量的可维护性要差。更严重的是,我仍然不确定这是否是一个解决方案eally解决了这个问题,因为我确实需要发布所有的用户属性,而且我无法指定投影字段而不丢失其中的一些。这将是真实的,无论我发布的是哪个集合。哈哈,很好,我不确定