流星助手没有运行反应
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>
我正在使用 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>