【问题标题】:Make Meteor Reactive to Specific Subitem of Meteor.user()使 Meteor 响应 Meteor.user() 的特定子项
【发布时间】:2015-04-21 00:59:11
【问题描述】:

我要做什么...

我需要使用一些存储在用户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() 的所有子属性。但我需要能够选择我对哪些子属性做出反应!

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

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

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

    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 将仅在该特定属性更改时触发。

    【讨论】:

    • 我同意,这比我比较变化价值的幼稚方法要好。从概念上讲,它与按字段发布的过滤方式相同。我喜欢它。
    【解决方案2】:

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

    只是为了提供一些多样性,我建议将您的偏好(或整个该死的个人资料)移到它自己的收藏中。然后,使用.publish(null,... 始终可以访问该集合。

    这两种解决方案都可以很好地工作,只是我更喜欢除了登录凭据附加到关键的 users 集合之外什么都没有。

    【讨论】:

    • 更严肃地说,我仍然不确定这是否真的解决了问题,因为我确实需要发布所有用户属性,而且我无法指定投影字段而不丢失其中的一些。无论我从哪个收藏中发布,这都是正确的。
    • 哈哈哈很好,不过我不确定我是否跟上了。您已经让用户自动发布了一个安全子集,然后您为给定用户自动发布了 preferences 集合。文档看起来像:{user: '123', p1: 'apples', p2: 'vanilla mostly'}。然后,DDP 发送更改的唯一时间是 p1p2 更改时。或者你可能会发疯并为每个用户偏好设置 1 个文档 {user:'123', prefName:'What flavor', prefVal:'Vanilla mostly'},尽管我认为这有点矫枉过正。
    • 将用户信息放在用户文档中对我来说似乎是最简单的解决方案。我希望有一个倾向于这种范式的解决方案。我的动机是我有多个偏好参数,这些参数将而且必须独立变化。有足够的参数,所需文档的数量有点愚蠢,使用会话变量从 single 跟踪器中的 one 文档自动更新似乎更合乎逻辑一次。我还有一个进一步的动机,即会话变量在不同的上下文中比 pub/subbing 更容易管理。
    • 当然,我认为 MOST Meteoric 解决方案是让反应变量仅在块中引用的特定属性实际上是已更改的属性时触发其反应父块。我同意这个答案一个解决方案,但是对于像我这样的多参数系统来说,它的可维护性比 session var 工作要差。
    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多