简体   繁体   中英

Combining 2 Collection in 1 Template Meteor.js

I'm trying to make a category system and i cant seem to figure out how to make it work. here's a mock js and html to demonstrate what im trying to accomplish

test.js

Categories = new Meteor.Collection('categories');
Rooms = new Meteor.Collection('rooms');

if (Meteor.isClient) {    
   Template.Category_System.categories = function () {
      return Categories.find({});
   };
   Template.Category_System.rooms = function () {
      return Rooms.find({}); //here i want to return the rooms and users in the Rooms collection but only the rooms that fall under the category and subcategory of the Categories collection
   };
}

if (Meteor.isServer) {
   Meteor.startup(function () {
        Categories.insert({category:"category1",subcategories:[{subcategory:"subcategory1",rooms:[]},{subcategory:"subcategory2",rooms:[]}]};
        Categories.insert({category:"category2",subcategories:[{subcategory:"subcategory1",rooms:[]},{subcategory:"subcategory2",rooms:[]}]};

        Rooms.insert({category:"category1",subcategory:"subcategory1",room:'Room_01',users:[a,b,c]});
        Rooms.insert({category:"category1",subcategory:"subcategory1",room:'Room_02',users:[d,e,f,g,h]});
        Rooms.insert({category:"category1",subcategory:"subcategory2",room:'Room_03',users:[i]}); 
        Rooms.insert({category:"category2",subcategory:"subcategory1",room:'Room_01',users:[j,k]});
        Rooms.insert({category:"category2",subcategory:"subcategory2",room:'Room_02',users:[l,m,n]});
        Rooms.insert({category:"category2",subcategory:"subcategory2",room:'Room_03',users:[o,p,q,r]});               
   });
}

test.html -> just the template

<template name="Category_System">
   {{#each categories}}
        {{category}}
        {{#each subcategories}}
             {{subcategory}}
             {{#each rooms}}
                  {{room}}{{users}}
             {{/each}}
        {{/each}}
   {{/each}}
</template>

the outcome i'm trying to achieve

category1
    -subcategory1
         -Room_01 a,b,c
         -Room_02 d,e,f,g,h
    -subcategory2
         -Room_03 i
category2
    -subcategory1
         -Room_01 j,k
    -subcategory2
         -Room_02 l,m,n
         -Room_03 o,p,q,r

thanks in advance

Based on your mock code, you could do something like the following:

category.js

Categories = new Meteor.Collection('categories');
Rooms = new Meteor.Collection('rooms');

if (Meteor.isClient) {    
    Template.Category_System.categories = function () {
        return Categories.find();
    };
    Template.Category_System.rooms = function ( cat ) {
        var _subcat = this.subcategory,
            _cat = cat;
        return Rooms.find({ category: _cat, subcategory: _subcat });
    };
}

if (Meteor.isServer) {
    Meteor.startup(function () {
        if ( !Categories.find().count() ) {
            Categories.insert({category:"category1",subcategories:[{subcategory:"subcategory1",rooms:[]},{subcategory:"subcategory2",rooms:[]}]});
            Categories.insert({category:"category2",subcategories:[{subcategory:"subcategory1",rooms:[]},{subcategory:"subcategory2",rooms:[]}]});
        }
        if ( !Rooms.find().count() ) {
            Rooms.insert({category:"category1",subcategory:"subcategory1",room:'Room_01',users:["a","b","c"]});
            Rooms.insert({category:"category1",subcategory:"subcategory1",room:'Room_02',users:["d","e","f","g","h"]});
            Rooms.insert({category:"category1",subcategory:"subcategory2",room:'Room_03',users:["i"]});
            Rooms.insert({category:"category2",subcategory:"subcategory1",room:'Room_01',users:["j","k"]});
            Rooms.insert({category:"category2",subcategory:"subcategory2",room:'Room_02',users:["l","m","n"]});
            Rooms.insert({category:"category2",subcategory:"subcategory2",room:'Room_03',users:["o","p","q","r"]});
        }
    });
}

category.html

<head>
  <title>Category System Test</title>
</head>

<body>
  {{> Category_System}}
</body>

<template name="Category_System">
    <ul>
        {{#each categories}}
        <li>
            {{category}}
            <ul>
                {{#each subcategories}}
                     <li>
                        {{subcategory}}
                        <ul>
                            {{#each rooms ../category }}
                                <li>{{room}} - {{users}}</li>
                            {{/each}}
                        </ul>
                     </li>
                {{/each}}
            </ul>
        </li>
        {{/each}}
    </ul>
</template>

Key thing to note is the passing of ../category in the block helper for rooms and the template helper for rooms which accepts the category parameter and also makes use of the current subcategory data context to filter the Room collection.

If you run this under Meteor 0.8.0, you should see the following output... 上面代码中的示例输出

You could make this easier by completing the reference to the rooms array in each of your Category docs. Either do this through a UI or capture the insertId for each Room doc and update the appropriate Category doc as you seed.

By the way, you'll probably want to throw in a check when you are seeding your collections (see the code above)...otherwise, you'll wind up with lots and lots of records every time you make a change and the app restarts.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM