在Meteor中渲染集合内的数组

在Meteor中渲染集合内的数组,meteor,Meteor,我有一组牌,每个牌都有很多张牌。 字段“cards”是一个数组,其中包含牌组中牌的ID 问题是,我有一个卡片列表,用户可以从中选择要添加到卡片组中的卡片。当用户选择一张卡添加到卡片组集合内的卡片阵列时,Deps抛出一个异常,说“不能在同一分支中创建第二个地标”,除非我不使用分部来呈现列表,这对我来说是个问题,因为每张卡都有自己的事件。虽然在我刷新页面后,数据被正确地添加到了数据组中,但是会出现更新 Decks.js Template.deckList.deck = () -> Deck

我有一组牌,每个牌都有很多张牌。 字段“cards”是一个数组,其中包含牌组中牌的ID

问题是,我有一个卡片列表,用户可以从中选择要添加到卡片组中的卡片。当用户选择一张卡添加到卡片组集合内的卡片阵列时,Deps抛出一个异常,说“不能在同一分支中创建第二个地标”,除非我不使用分部来呈现列表,这对我来说是个问题,因为每张卡都有自己的事件。虽然在我刷新页面后,数据被正确地添加到了数据组中,但是会出现更新

Decks.js

Template.deckList.deck = () ->
  Decks.findOne(_id: Session.get "deck").cards
Deck-list.html

<template name="deckList">
    <section class="deck-list"><h1>deck</h1>
    <ul class="cards">
        {{#each deck}}
            {{> cardInList}}
        {{/each}}
    </ul></section>
</template>

甲板
    {{{每层} {{>cardInList} {{/每个}}
现在我想制作一个单独的集合来保存两个ID(卡片和牌组),但这可能不适用于具有相同问题的未来集合(例如游戏集合中的手)


谢谢

你的思路是对的,但如果我没弄错的话,你的设计很糟糕。您不希望每次添加/删除卡片时都必须更新卡片组文档中的数组。在卡片组文档中省去
cards
字段,而在卡片文档中添加
deckId
字段会更容易。虽然MongoDB通常鼓励嵌套/嵌入字段,但Meteor集合通常在典型的关系数据库样式模式下工作得更好。看看这种解决问题的方法:

Decks.js

Template.deckList.deck = () ->
  Decks.findOne( _id: Session.get "deck" )

Template.deckList.cards = () ->
  Cards.find( deckId: Session.get "deck" )
Deck list.html

<template name="deckList">
  <section class="deck-list">
    <h1>{{#with deck}} {{title}} {{/with}} Deck</h1>
    <ul class="cards">
      {{#each cards}}
      {{> card }}
      {{/each}}
    </ul>
  </section>
</template>

<template name="card">
  <li>{{foobar}}</li>
</template>
干杯


注意:这一问题最初是在

上得到回答的,该问题的发起人是!为你的个人代码问题获得专家的支持。这个解决方案的问题是卡片收集是静态的,我的意思是它不会更新里面的任何东西。我可能只是去使用多对多的关系,然后再收集一次来保存卡片Id和卡片组Id。这样行吗?行,但这不是一个很好的解决方案。你说的“静态”是什么意思?如果您想要另一个集合来保存卡和卡组ID,那么您可能有一个卡集合,这种方法可以完美地使用它。与使用涉及卡片集合的另一种方法相比,使用这种方法您不必更多地更改卡片,这种方法只需添加一个额外的字段,同时消除了使用另一种方法可能存在的所有模板迭代痛苦。此外,除非一张卡片也可以属于多个卡片组,你可能不想要多对多的关系:)事实上,我想要多对多的关系,因为一张牌可以属于多个牌组,一张牌组最多可以有一张牌的四份副本。我只是想把那个“deckId”字段做成一个数组来接受多个甲板?啊。在这种情况下,您可能确实需要这样一个单独的表。我将使用我在回答中概述的相同方法,但是让服务器上的publish方法根据deckId/cardd集合仅返回当前正在查看的卡片组的有效卡片。
// Server publish method
// Return just cards that are in deck "deckId"
Meteor.publish('cards', function (deckId) {
    var cardIds = CardsDecks.find({ deckId: deckId }).map(function (connector) {
        return connector.cardId;
    });

    return Cards.find({ _id: {$in: cardIds } });
});

// Client subscribe method
Meteor.subscribe('cards', Session.get('currentDeckId')); // Get just the cards related to the current deck