1

由于我关闭了自动发布,因为它在现实世界中不切实际,我的模板停止呈现集合(#each 似乎没有循环)。我已经为集合设置了手动发布/订阅,当我将本地集合记录到控制台时,我可以看到其中包含项目,但模板无法呈现项目。

为了保持模板的自动更新特性,手动子/发布集合时我需要做些什么吗?

这是我创建的稀释测试用例:

// client

Col = new Meteor.Collection('testcol');

// I have tried wrapping this in autosubscribe as well: 
Meteor.subscribe('testcol', function() {
    return Col.find();
});


Template.hello.items = function() {
    var col = Col.find();
    if (col) {
        console.log("Test items" , col);
        return col.fetch().items;
    }
}

// server

if (Meteor.is_server) {
    Col = new Meteor.Collection('testcol');

    Meteor.publish('testcol', function() {
        return Col.find();
    })
}


// bootstrap: 

Meteor.startup(function () {  
  if (Col.find().count() < 5) {
    for (var i=0; i<5; i++) {
        Col.insert({
            title: 'Test ' + i,
            items: [
                {title: 'item 1', value:true},
                {title: 'item 2', value:false},
                {title: 'item 3', value:true}
            ]
        });
    }
    }
})

// Template


<head>
  <title>test</title>
</head>

<body>
  {{> hello}}
</body>

<template name="hello">
  <h1>Where did the data gone to?</h1>
  Items from the test collection: 
  <UL>
  {{#each items}}
    <LI> ITEM: {{title}} 
  {{/each}}
</UL>
</template>
4

1 回答 1

3

#each 的 Meteor 版本需要 aCursor或 anArray作为您的代码点items,因为这是您的函数返回的每个文档的子属性,undefined因此您需要遍历所有 Docs 然后是 items 或 findOne({_id:???}) 循环它的物品;

因此,以下工作(支持版本 1)用于返回集合中的所有文档:

  1. return col.find()
  2. return col.find().fetch()

此外,您应该只在通用脚本中声明一次集合,然后在下面的相应工作代码中发布/订阅,如果您有问题,请回复。

.html

  1 <head>
  2     <title>test</title>
  3 </head>
  4 
  5 <body>
  6     {{> hello}}
  7 </body>
  8 
  9 <template name="hello">
 10 <h1>Where did the data gone to?</h1> 11 Items from the test collection: 
 12 <ul id="docs">
 13     {{#each docs}}
 14     <li>Doc: {{title}}
 15         <ul class="items">
 16             {{#each items}}
 17             <li>Item: {{title}}</li>
 18             {{/each}}
 19         </ul>
 20     </li>
 21     {{/each}}
 22 </ul>   
 23 </template> 

.js

  1 // client
  2 //
  3 Col = new Meteor.Collection('testcol');
  4 //
  5 // // I have tried wrapping this in autosubscribe as well: 
  6 if(Meteor.is_client){
  7     Meteor.subscribe('testcol');                                                                                                                                                                        
  8 
  9     Template.hello.docs  = function() {
 10          return Col.find();
 11     }
 12 } 
 13 
 14     
 15 // server
 16          
 17 if (Meteor.is_server) {
 18             
 19     Meteor.publish('testcol', function() {
 20         return Col.find();
 21     });
 22 }
 23 
 24 
 25 // bootstrap: 
 26 
 27 Meteor.startup(function () {  
 28     if (Col.find().count() < 5) {
 29         for (var i=0; i<5; i++) {
 30             Col.insert({
 31                 title: 'Test ' + i,
 32                 items: [
 33             {title: 'item 1', value:true},
 34                 {title: 'item 2', value:false},
 35                 {title: 'item 3', value:true}
 36             ]
 37             });
 38         }
 39     }
 40 });
于 2012-07-20T04:29:12.447 回答