Dies ist, wie ich vorgehen:
client/views/home/home.html
<template name="home">
{{#if itemsReady}}
{{> itemsList}}
{{/if}}
</template>
<template name="itemsList">
<ul>
{{#each items}}
{{> item}}
{{/each}}
</ul>
</template>
<template name="item">
<li>{{value}}</li>
</template>
client/views/home/home.js
Template.home.helpers({
itemsReady:function(){
return Meteor.subscribe("items").ready();
}
});
Template.itemsList.helpers({
items:function(){
return Items.find();
}
});
Template.itemsList.rendered=function(){
// will output 100, once
console.log(this.$("li").length);
};
lib/collections/items.js
Items=new Mongo.Collection("items");
server/collections/items.js
insertItems=function(){
var range=_.range(100);
_.each(range,function(index){
Items.insert({value:"Item "+index});
});
};
Meteor.publish("items",function(){
return Items.find();
});
server/startup.js
Meteor.startup(function(){
Items.remove({});
if(Items.find().count()===0){
insertItems();
}
});
Wir spezifizieren, dass wir unsere Liste der Elemente nur machen möchten, wenn die Veröffentlichung bereit ist, so durch, dass Zeitdaten zur Verfügung steht und die richtige Anzahl von li
Elemente erhalten in der Liste angezeigt Callback angezeigt.
nun das gleiche mit iron:router
waitOn
Feature:
client/views/home/controller.js
HomeController=RouteController.extend({
template:"home",
waitOn:function(){
return Meteor.subscribe("items");
}
});
client/lib/router.js
Router.configure({
loadingTemplate:"loading"
});
Router.onBeforeAction("loading");
Router.map(function(){
this.route("home",{
path:"/",
controller:"HomeController"
});
});
client/views/loading/loading.html
<template name="loading">
<p>LOADING...</p>
</template>
Die Verwendung von iron:router
ist wahrscheinlich besser, weil es ein gemeinsames Muster elegant löst: Wir brauchen den itemsReady-Helfer nicht mehr, die Home-Vorlage wird nur gerendert, wenn die von waitOn zurückgegebene WaitList
global bereit ist.
Man darf nicht gleichzeitig Lade Vorlage und Einstellungen als Standard „Laden“ Haken sonst wird es nicht funktionieren hinzuzufügen vergessen.
Sie irgendwo die Daten abonnieren? Verwenden Sie Eisenrouter? –
'listItem'-Vorlagen erhalten Daten aus einer vermutlich reaktiven Sammlung. In diesem Fall können Sie nie sicher sein, dass * alle * von ihnen gerendert werden. Sie können jedoch ein paar Tricks verwenden, um eine Benachrichtigung zu erhalten, wenn das erste Set gezeichnet wird. Trotzdem versuchst du wahrscheinlich etwas nicht im "Meteor Way" zu machen, also würde ich nach einer besseren Lösung suchen. Was versuchst du zu erreichen? –