Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止Meteor.js模板在没有数据的情况下呈现_Javascript_Jquery_Twitter Bootstrap_Meteor - Fatal编程技术网

Javascript 如何防止Meteor.js模板在没有数据的情况下呈现

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

有人能帮我理解流星的行为吗

我想在我的项目中实现一个通知系统,类似于苹果咆哮。 当记录写入数据库时,它使用简单的jQuery效果来显示消息。我简化了代码示例,以显示基本问题:

守则:

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
    } 
});
另外,将您的集合定义为var
Messages=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!在渲染之前,必须确保订阅已准备就绪。救命恩人!