在Meteor中渲染集合内的数组

时间:2013-11-03 05:58:30

标签: meteor

我有一组甲板,每个甲板都有许多卡片。 字段“cards”是一个数组,其中包含卡片中ID的ID。

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

Decks.js

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

甲板-list.html

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上,但如果我理解你的话,你的设计就会很糟糕。每次添加/删除卡时,您都不希望更新套牌文档中的数组。您可以更轻松地省略卡片文档中的cards字段,而是在卡片文档中添加deckId字段。虽然MongoDB经常鼓励嵌套/嵌入字段,但Meteor Collections通常在典型的关系数据库样式模式下工作得更好。看看你解决问题的方法:

<强> Decks.js

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

Template.deckList.cards = () ->
  Cards.find( deckId: Session.get "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>

使用这种方法,您只需在卡片中添加/删除卡片,即可实时自动反映更改,而无需更新其他数据库集合中的其他文档。

编辑:如果你想要一个多对多的集合而不是一对多的集合,你可以修改服务器上的发布方法以返回特定套牌的卡片,并避免发布该连接的需要表到客户端。它可能看起来像:

// 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

干杯!

注意:这最初是在CodersClan

上回答的