我想将集合中的项目名称列表作为一个简单的数组用于自动完成用户输入和检查重复项等操作。我希望此列表具有反应性,以便数据的更改将反射(reflect)在数组中。我根据 Meteor 文档尝试了以下方法:
setReactiveArray = (objName, Collection, field) ->
update = ->
context = new Meteor.deps.Context()
context.on_invalidate update
context.run ->
list = Collection.find({},{field: 1}).fetch()
myapp[objName] = _(list).pluck field
update()
Meteor.startup ->
if not app.items?
setReactiveArray('items', Items, 'name')
#set autocomplete using the array
Template.myForm.set_typeahead = ->
Meteor.defer ->
$('[name="item"]').typeahead {source: app.items}
此代码似乎有效,但它会缩短我的应用程序的加载时间(在 dev/localhost 上加载需要 5-10 秒,而没有此代码则需要约 1 秒)。难道我做错了什么?有没有更好的方法来实现这一点?
最佳答案
您应该可以使用 Items.find({},{name: 1}).fetch()
,它将返回一个项目数组并且是响应式(Reactive)的,因此只要查询结果发生变化,只要在响应式(Reactive)上下文中调用它,它就会重新运行其封闭函数。
对于Template.myForm.set_typeahead
助手,您可能希望在助手本身内部调用该查询,将结果存储在局部变量中,然后调用 Meteor.defer
使用引用该变量的函数。否则,我不确定查询在被调用时是否会在响应式(Reactive)上下文中。
关于meteor - 如何从 Meteor 集合中创建 react 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12011224/