【问题标题】:Iterating array-elements as single values inside collection-document (Meteor)将数组元素迭代为集合文档(Meteor)中的单个值
【发布时间】:2019-06-08 22:45:56
【问题描述】:

我正在尝试创建一个在线聊天列表。每当一个人进入一个房间时,他的昵称就会被推入 inRoom 的数组中,当他离开时,它会再次被拉出。到目前为止,这工作正常。不过,在实际列表中显示数组让我感到困惑。

我需要将名称分开以便将它们放入锚标记中,因为这些名称是 url 参数。

房间文件如下所示:

{
  "_id": "crsEES5d22uYJiqDZ",
  "name": "Room",
  "roomdesc": " ",
  "inRoom": [name1, name2, name3],
  "createdAt": "2019-06-08T12:39:51.382Z",
  "owner": "Kuroki"
}

我有一个帮手来获取数组。我使用 getParam 来获取房间的名称以便找到正确的房间。

Template.onlineliste.helpers({
  roomData() {
    var name = FlowRouter.getParam('name');
    return Channels.find({name:name}, {sort: {createdAt: 1}})
  },
});

然后我尝试迭代哪一个当然会将数组显示为一个整体,而不是将每个名称都显示为单个值

<template name="onlineliste">
    {{#each roomData}}
    {{inRoom}} 
    {{/each}}
  </template>

有人可以告诉我如何迭代数组的单个值,这样它们就会显示出来

  • 姓名 1
  • 名称 2
  • 名称 3

代替名称1、名称2、名称3

感谢您的帮助

【问题讨论】:

    标签: meteor meteor-blaze


    【解决方案1】:

    有人可以告诉我如何迭代数组的单个值,以便它们显示为...

    inRoom 字段本身就是一个数组,所以你需要第二个each

    <template name="onlineliste">
      {{#each room in roomData}}
        <ul>
          {{#each name in room.inRoom}} 
            <li>{{name}}</li>
          {{/each}}
        </ul>
        {{/each}}
    </template>
    

    如果无论如何只有一个房间要显示,您甚至可以更改代码以返回当前的单人房间:

    Template.onlineliste.helpers({
      roomData() {
        var name = FlowRouter.getParam('name');
        return Channels.findOne({name:name}})
      },
    });
    

    仅按名称返回一个房间文档,不需要迭代。然后您可以通过以下方式访问它:

    <template name="onlineliste">
      {{#with roomData}}
        <ul>
          {{#each name in this}} 
            <li>{{name}}</li>
          {{/each}}
        </ul>
      {{/with}}
    </template>
    

    【讨论】:

    • 我认为这对我的问题不起作用的原因是 {{name}} 没有引用数组的值。我用 find 和 findOne 试过了。
    • 您是否console.log(Channels.findOne({name:name}})) 验证它是否返回任何内容?是的,name 值是正确的 - 这是 for (let element in iterable) { ... } 的 blaze 等价物,其中值 name 被分配了迭代当前元素的上下文。
    • Uncaught ReferenceError: Channels is not defined at &lt;anonymous&gt;:1:1 它说,当我尝试这个 console.log 时。但这很奇怪,因为我已经可以通过执行 {{roomData.inRoom}} 来返回整个数组。但是,如果我使用 findOne-option console.log 以{{#each}} currently only accepts arrays, cursors or falsey value 响应
    • 这就是为什么你需要在findOne 上使用with,就像我发布的最后一个代码sn-p 一样。请尝试使用它。
    • 我做到了。这是同样的错误:Error: {{#each}} currently only accepts arrays, cursors or falsey values. 我什至复制了 sn-p。我什至在空白页上试了一下,看看是否有其他代码在干扰,但结果相同。如果您非常确定这就是这样做的方法,我怀疑故障一定出在其他地方。我会试着找到它。感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多