流星助手没有运行反应

Meteor helper not running reactively

我正在使用 mizzao:user-status 软件包制作在线用户列表。

请注意,以下代码是 coffeescript,它一直运行良好,特别是因为我坚持使用 Blaze 而不是 React(我还没有找到在 coffeescript 中使用 JSX 的方法)。

除了切线,我对 client.coffee 中的 users.helpers 特别有疑问。 debugger 只调用一次,当我检查其中的 users_data 变量时,它显示一个空数组。很明显,这至少有一部分是反应性的,因为当我继续越过断点并再次检查 users_data 的值时,它是非空的。但是 users 助手的 return 值似乎没有改变。函数不重新运行。

tl;博士

如何在 users_data 更改时使 users 辅助方法重新运行

# ------------------
# server.coffee
# ------------------

Meteor.publish 'user_status', ->
  Meteor.users.find(
    { "status.online": true },
    fields: {}
  )

# ------------------
# client.coffee
# ------------------

Meteor.subscribe 'online_users'
users = Template.users
users.helpers
  users: ->
    window.users_cursor = Meteor.users.find
      "status.online": true
    window.users_data = users_cursor.collection._docs._map
    debugger
    window.final = Object.keys(users_data).map (_id) =>
      user = users_data[_id]
      {
        _id,
        name: user.profile.name
      }
    final

以及 Blaze 模板的相关部分:

<body>
  <h1>Welcome to Meteor!</h1>
  {{> loginButtons }}
  {{> users}}
</body>

<template name="users">
  {{#each users}}
    <li>{{_id}}</li>
  {{/each}}
</template>

值得庆幸的是,这不是 Meteor 本身的错误,也不难纠正。

这整件事是不必要的:

  users: ->
    window.users_cursor = Meteor.users.find
      "status.online": true
    window.users_data = users_cursor.collection._docs._map
    debugger
    window.final = Object.keys(users_data).map (_id) =>
      user = users_data[_id]
      {
        _id,
        name: user.profile.name
      }
    final

取而代之的是:

users: ->
  Meteor.users.find({})

Meteor.users.find 结果不是数组,不响应 [0] 样式索引,这就是为什么我认为它不适合作为 return帮助者的价值。但是它确实响应 forEach。这就是为什么它适用于模板的以下重构:

<template name="users">
  {{#each user in users}}
    <li>{{user._id}</li>
  {{/each}}
</template>

剩下的一个问题是 Meteor.users.find("status.online": true) 仍然不起作用,它必须是 find({})。我会解决这个问题,并可能 post 提出一个问题。

除了 maxple 的回答之外,您还可以在 HTML 代码中这样做:

<template name="users">
  {{#each users}}
    {{this._id}}
  {{/each}}
</template>