2013-01-08 2 views
3

Je veux rendre un modèle réactif basé sur ce document:Modèle Réactif avec objet Compex

Sprint: 
    WorkStories: 
     Tasks 

Je sais que cela peut être fait en faisant une collection Meteor pour chaque « niveau », mais cela signifie que le résultat est en fait être stocké comme un document séparé dans la base de données. Je veux savoir s'il est possible d'avoir une collection/document pour Sprint, qui a la collection standard de WorkStories avec une collection standard de Tasks chacun, rendu à un modèle réactif. J'ai vu [Meteor.deps.context] [1], mais je n'arrive pas à comprendre comment le câbler (ou même si c'est le bon outil), et aucun des exemples ne fait quelque chose comme ça .

J'ai également vu [cette question] [2], mais il semble poser des questions sur la connexion de documents liés mais séparés, ne rendant pas un seul document.

Répondre

3

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

+0

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

+0

Vous avez raison, j'ai fait une mise à jour à ma question et posté dans le groupe google météore. – TimDog

+2

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 –