Javascript 如何防止Meteor.js模板在没有数据的情况下呈现
有人能帮我理解流星的行为吗 我想在我的项目中实现一个通知系统,类似于苹果咆哮。 当记录写入数据库时,它使用简单的jQuery效果来显示消息。我简化了代码示例,以显示基本问题: 守则:Javascript 如何防止Meteor.js模板在没有数据的情况下呈现,javascript,jquery,twitter-bootstrap,meteor,Javascript,Jquery,Twitter Bootstrap,Meteor,有人能帮我理解流星的行为吗 我想在我的项目中实现一个通知系统,类似于苹果咆哮。 当记录写入数据库时,它使用简单的jQuery效果来显示消息。我简化了代码示例,以显示基本问题: 守则: var Messages = new Meteor.Collection("messages"); if (Meteor.isClient) { Template.Notification.Message = function() { return Message.findOne({}, {sor
var Messages = new Meteor.Collection("messages");
if (Meteor.isClient) {
Template.Notification.Message = function() {
return Message.findOne({}, {sort: {seq: -1}});
};
Template.Notification.rendered = function() {
$("#livebar").fadeIn(400).delay(1000).fadeOut(400);
}
}
模板:
<template name="Notification">
<div class="row">
<div class="span6 alert alert-error" id="livebar" style="display:none;">
{{Messages.text}}
</div>
</div>
</template>
{{Messages.text}
如果页面被呈现,一个空的不可见区域将被jQuery效果呈现,然后系统加载反应数据源(消息)并再次呈现该区域!
我试图阻止它渲染两次,但没有成功。这个错误似乎很容易纠正,但我被困在这里了。我将感谢任何帮助 您可以使用
{{>if}
块围绕模板调用{{>Notification}
{{#if has_notifications}}
{{> Notifications}}
{{/if}}
//JS
Template.foo.has_notifications = function() {
Message.find().count() > 0;
}
但是,由于数据不是一块一块地到达的,因此可能会发生多次呈现模板的情况。暂停可以帮你做到这一点 您需要这个额外的代码: 首先在项目内部的终端上执行meteor remove autopublish 第二,定义要发布的内容
//On isServer
Meteor.publish('messages', function(){
return Messages.find();
});
然后订阅该数据并等待其就绪
//On isClient
subscription_handle = Meteor.subscribe('messages');
Meteor.autorun( function(computation) {
if( subscription_handle.ready() ) {
//The data is now ready, start your templates here
computation.stop(); //Stop autorun
}
});
另外,将您的集合定义为varMessages=newmeteor.collection(“Messages”)代码>所以它是一个全局变量
另一种完全不同(但更简单)的方法是在Iron Router中使用模板路由的属性,以便在数据准备好后呈现模板。感谢您的解决方案,它完成了任务!它甚至更简单:{{{{if Messages}}{{Messages.text}{{/if}}
它只在加载数据源后才渲染模板。{{{if Messages}
是帮助器还是meteor通过这种方式调用它来检查Messages集合中是否存在元素?你是对的,我不是指“消息”,而是指“Template.Notification.Message”帮助程序,该帮助程序已可用于此模板。因此,它应该读为{{#if Message}}
Try template.templateName.created和Meteor.yes!在渲染之前,必须确保订阅已准备就绪。救命恩人!