【问题标题】:Rendering an array inside a collection in Meteor在 Meteor 的集合中渲染数组
【发布时间】:2013-11-14 00:58:59
【问题描述】:

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

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

甲板.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>

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

谢谢!

【问题讨论】:

  • 这个问题由CodersClan赞助!通过赏金获得针对您的个人代码问题的专家支持。

标签: meteor


【解决方案1】:

你走在正确的轨道上,但如果我对你的理解正确,那么你的设计就很糟糕。您不希望每次添加/删除卡片时都必须更新卡片组文档中的数组。在卡片文档中省略 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>

使用这种方法,您可以简单地在套牌中添加/删除卡片,并且更改将自动实时反映,而无需更新另一个数据库集合中的其他文档。

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

// 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上回答的

【讨论】:

  • 此解决方案的问题在于 Cards 集合是静态的,我的意思是它不会更新其中的任何内容。我可能只是去使用多对多关系并制作另一个集合来保存卡片 ID 和套牌 ID。这样会好用吗?
  • 这可以工作,但这不是一个很好的解决方案。 “静态”是什么意思?如果您想要另一个集合来保存卡片和套牌 ID,大概您有一个卡片集合,此方法可以完美地使用。与使用涉及卡片集合的另一种方法相比,使用这种方法不需要更多地更改卡片,这种方式只是添加了一个额外的字段,同时消除了其他方法可能存在的所有模板迭代痛苦。跨度>
  • 另外,除非一张卡也可以属于许多套牌,否则您可能不想要多对多关系:)
  • 实际上,我确实想要多对多的关系,因为一张卡可以属于许多套牌,而一套卡最多可以有四张特定卡的副本。我只是想把那个“deckId”字段变成一个数组来接受多个甲板?
  • 啊。在这种情况下,您可能确实想要一个这样的单独表格。我将使用我在答案中概述的相同方法,但让服务器上的发布方法仅返回您当前正在查看的卡片组有效的卡片,基于该卡片组 ID/卡片 ID 集合。
猜你喜欢
  • 2015-07-13
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多