【问题标题】:Passing array via ReactiveVar in Meteor在 Meteor 中通过 ReactiveVar 传递数组
【发布时间】:2017-07-31 20:47:36
【问题描述】:

我有一个 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),但读取

[对象对象],[对象对象]

我很确定这里发生了一些有趣的事情,因为我使用的是全局 Meteor 集合(Meteor.users.find().fetch(),而不是定义我自己的集合),但我不知道如何解决它。

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

【问题讨论】:

  • 尝试使用空数组而不是字符串来初始化反应变量。我不知道这是不是唯一的问题,但这肯定是个问题。
  • self.myAsyncValue = new ReactiveVar([]); ?
  • 似乎没有产生任何影响
  • console.log(typeof Template.instance().myAsyncValue.get()); 告诉我他们是类型object
  • 这可能吗?通过文档A ReactiveVar holds a single value that can be get and set

标签: javascript meteor


【解决方案1】:

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

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

关于:

[对象对象],[对象对象]

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

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

最好的方法是创建一个只发送必要字段的订阅,例如:_id、info.firstName。您还应该对列表用户有一些标准并使用分页。也可以考虑为此目的使用搜索功能。

【讨论】:

  • 是的,我将其变成了搜索功能,但我希望首先能够获取用户从服务器到客户端。我想得越多,最好的方法似乎是订阅。谢谢
【解决方案2】:

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

更新

基于 mper 的评论

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

测试于

  • meteor@1.6.0
  • reactive-var@1.0.11

【讨论】:

  • @redress 没问题。如果您需要更多信息,请发表评论。如果有效,请不要忘记将答案标记为正确。谢谢!
  • ReactiveArray 包是否允许我使用返回数组 Meteor.users.find().fetch() 的 Meteor 方法进行插值?我很困惑这应该如何解决这个问题
【解决方案3】:

我对你的问题有几点意见:

不要抓取

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

Meteor 集合是反应式的

Meteor 集合已经是反应式的,这意味着如果它们发生变化,它们也会触发模板的变化。因此,您无需使用 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

【讨论】:

    【解决方案4】:

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

    你需要在这里反应。

    集合具有反应性意义pub/sub

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      相关资源
      最近更新 更多