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または anを想定しているため、すべてのドキュメント、アイテム、または findOne({_id:???}) ループをループする必要があります。そのアイテムの;Arrayitemsundefined

したがって、コレクション内のすべてのドキュメントを返すために、次のように機能します (バージョン 1 を優先)。

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

また、共通スクリプトで一度だけコレクションを宣言してから、以下のそれぞれの作業コードで pub/sub を宣言する必要があります。質問がある場合は投稿してください。

.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 に答える