通过Meteor中的ReactiveVar传递数组

时间:2015-04-01 02:13:09

标签: javascript meteor

我有一个Meteor方法,它返回我的应用程序上的所有用户帐户

returnUsers: function(){
    return Meteor.users.find().fetch();
}

我正在使用new ReactiveVar将Meteor方法的返回值传递给我的模板助手:

Template.listViewTemplate.created = function (){
    var self = this;
    self.myAsyncValue = new ReactiveVar("Waiting for response from serv er...");
    Meteor.call('returnUsers', function (err, users) {
        if (err)
            console.log(err);
        else 
            self.myAsyncValue.set(users);
    });
}

Template.listViewTemplate.helpers({
    userCollection: function(){
        return Template.instance().myAsyncValue.get();
    }
});

但是当我将用户渲染到视图中时,我收到一个读取

的控制台错误
  

{{#each}}目前只接受数组

当我在没有#each迭代器的情况下渲染时,使用

<ul id='usersList'>
    {{userCollection}}
</ul>

我的网页上的输出准确反映了用户数量(2),但是读取

  

[object Object],[object Object]

我很确定这里有一些蠢事,因为我正在使用全球Meteor集合(Meteor.users.find().fetch(),而不是定义我自己的集合),但我不知道如何绕过它。

我想显示所有用户的列表,以便当前用户可以点击其他用户并与他们共享文档 - 不知道如何解决这个问题。

4 个答案:

答案 0 :(得分:2)

ReactiveVar不喜欢数组。您可以安装ReactiveArray package,它应该完全符合您的要求。

更新

根据mper的评论

  

在最新版本的Meteor中,您可以将数组放入ReactiveVar中。

经过测试

  • meteor@1.6.0
  • reactive-var@1.0.11

答案 1 :(得分:2)

您不需要为此使用反应变量。 Template.listViewTemplate.created中的函数不是自动运行中的容器,这意味着:它不会被重新计算。

您的方案的最佳方法是:使用变量获取状态(加载,加载,错误)和另一个变量以保存数组本身附加到self。反应性很酷但你应该只在需要时使用它。

关于:

  

[object Object],[object Object]

这种情况正在发生,因为您没有从提供的对象中提取任何值,也没有使用{{#each}}进行循环。

您列出用户的解决方案既危险又低效。您正在向客户端发送用户集合中的所有字段,包括登录令牌。

最好的方法是创建一个仅发送必需字段的订阅,例如:_id,info.firstName。您还应该为列表用户提供一些条件并使用分页。为此目的,还要考虑一个搜索功能。

答案 2 :(得分:1)

我对你的问题有几点评论:

不要提取

您的方法不需要.fetch()。当您在集合上调用find()时,例如Meteor.users,将返回光标。模板(特别是#each)可以遍历游标。游标通常更好,因为您不会立即将整个集合加载到内存中 - fetch

流星集合是被动的

流星集合已经被反应,这意味着如果它们发生变化,它们也会触发模板上的更改。因此,您无需使用ReactiveVar来包装您的集合。

查询本地数据库

您不需要使用方法来获取用户,事实上,您不应该这样做,因为通常您希望对本地存储的数据库进行查询,而不是调用服务器。只需直接在模板助手中调用Meteor.users.find()即可。您可以(并且应该)通过subscriptions控制本地可用的内容。

#eachelse

一起使用

您可以在模板中使用以下内容:

 {{#each userCollection}}
 ...
 {{else}}
 Waiting for response from server...
 {{/each}}

如果userCollection为空,模板将呈现else块,就像您想要的那样。

综述

删除您的方法并将onCreated包含在内,将模板助手中的内容更改为return Meteor.users.find()并使用{{#each userCollection}}...{{else}}Waiting for response from server...{{/else}}

顺便说一下

在Meteor的最新版本中,您可以将数组放入ReactiveVar

答案 3 :(得分:-1)

Template.onCreated(function(){})只运行一次,流星方法只运行一次

你需要反应。

收藏品反应意义pub/sub

您需要创建一个publish function,允许某些用户获取数据库中的其他用户。因此,如果currentUser有权读取所有用户信息,则可以使用。我也限制字段。