Parce que database queries on collections are already reactive variables sur le client, le ci-dessous rendra unSprint
document avec imbriquéWorkStories
qui a imbriquéTasks
dans un modèle:
HTML:
<head>
<title>Sprints Example</title>
</head>
<body>
{{> sprints }}
</body>
<template name="sprints">
{{#each items}}
<div>Name: {{name}}</div>
{{#each this.WorkStories}}
<div>{{name}}</div>
{{#each this.Tasks}}
<div>{{name}}</div>
{{/each}}
{{/each}}
{{/each}}
</template>
Javascript:
Sprints = new Meteor.Collection("sprints");
if (Meteor.isClient) {
Template.sprints.items = function() {
return Sprints.find({});
};
}
if (Meteor.isServer) {
Meteor.startup(function() {
if (Sprints.find().count() === 0) {
Sprints.insert({ name: 'sprint1', WorkStories: [{ name: 'workStory1', Tasks: [{ name: 'task1' }, { name: 'task2' }, { name: 'task3' }] }, { name: 'workStory2', Tasks: [{ name: 'task1' }, { name: 'task2' }, { name: 'task3' }] }] });
}
});
}
MISE A JOUR AVEC RÉPONSE
par @ commentaire de Paul Young ci-dessous, le problème avec mon utilisation de $set
était le manque de citations dans la mise à jour. Une fois l'objet imbriqué rend dans le Template
, à partir de Meteor 0.5.3 vous pouvez mettre à jour les tableaux de sous simplement:
Sprints.update(Sprints.findOne()._id, { $set: { "WorkStories.0.name": "updated_name1" } });
CONTEXTE INFO
Cela ne charge l'objet initial, mais la mise à jour semble problématique. Je suis en mesure d'obtenir le modèle de réengendrer en appelant le bas dans la console:
Sprints.update(Sprints.findOne()._id, { name: 'sprint777', WorkStories: [{ name: 'workStory1232', Tasks: [{ name: 'task221' }, { name: 'task2' }, { name: 'task3' }] }, { name: 'workStory2', Tasks: [{ name: 'task1' }, { name: 'task2' }, { name: 'task3' }] }] })
Ce qui suit ces règles, par la Meteor Docs:
Mais si un modificateur ne contient pas de $ - opérateurs, il est alors interprété comme un document littéral et remplace complètement ce qui était auparavant dans la base de données. (Modificateurs de document littérales ne sont pas actuellement pris en charge par les mises à jour validées.
Bien sûr, ce que vous voulez est d'utiliser les opérateurs de style $set
sur les documents imbriqués et obtenir les modèles de réengendrer lorsque leurs propriétés imbriquées changent sans devoir remplacer le document entier dans la table.The 0.5.3 version of Meteor inclus la possibilité de rechercher des sous-réseaux:
Allow querying specific array elements (foo.1.bar).
J'ai essayé de faire la recherche sous tableau .
et n'ont pas été en mesure de mettre à jour le WorkStories
de l'entité sous-document d'origine, donc je posted a question dans le discours de Google.
Espérons que cela aide
Cela ne fonctionne pas. Il va charger l'objet initial, mais si j'apporte des modifications à la collection 'workStories', cela ne se reflète pas dans le modèle. – Tyrsius
Vous avez raison, j'ai fait une mise à jour à ma question et posté dans le groupe google météore. – TimDog
Je viens d'essayer votre exemple et cela semble fonctionner: 'Sprints.update (Sprints.findOne(). Id, {$ set: {" WorkStories.0.name ":" updated_name1 "}})' note le placement de citations –