1

私の流星ディレクトリは2つのファイルで構成されています:

social.js:

Messages = new Meteor.Collection("messages");

if (Meteor.isServer) {
}

if (Meteor.isClient) {
    Template.temple.messages = function() {
        return Messages.find();  
    };

    Meteor.startup(function () {
            console.log('console startup: ' + Messages.find().count());
    });

    console.log('console normal: ' + Messages.find().count());

    var ali = function() {
        console.log('console normal: ' + Messages.find().count());
    };

    setTimeout(function() {
        console.log('console normal: ' + Messages.find().count());
    }, 2000);
    // The callback function is not called on the following line:
    Meteor.subscribe('messages',function(){alert('ALERT!');});
}

social.html:

<head>
<title>naber</title>
</head>

<body>
{{> temple}}
</body>

<template name = "temple">
{{#each messages}}
{{message}} <br />
{{/each}}
</template>

コレクションは、しばらくしてから完全にロードされます。をラップした場合にのみ、ドキュメントの実際の数を確認できますsetTimeout。データベースが本当に完全に利用可能になった後に関数が実行されるようにするにはどうすればよいですか?

4

3 に答える 3

2

Meteor.subscribe(NAME)とペアになりMeteor.publish(NAME)ます。コードは呼び出されたものを購読しようとし"messages"ますが、その名前で何かを公開していません。

autopublishデータをまったく取得しているという事実は、デフォルトのパッケージを使用していることを示唆しています(参照.meteor/packagesして確認してください)。これは、明示的にデータを公開または購読する必要がないことを意味します。残念ながら、自動公開されたデータの準備ができたときにコールバックを取得する方法はありません (おそらく修正されるはずです)。したがって、これを行いたい場合は、公開したいデータを公開するためmeteor remove autopublishに使用する必要があります。Meteor.publishその後、実際にMeteor.subscribeコールバックを使用できます。

于 2013-01-28T22:33:25.760 に答える
1

Meteorの反応性がどのように機能するかにより、サーバーがまだクライアントにデータを送信していない場合に設計する必要のあるアプリケーション状態が常にあります。これを「ロード中」の状態と呼ぶことができます。

宣言内でTemplateは、依存するデータが利用可能かどうかを常に確認する必要があります。テンプレートがデータに依存している場合、データはリアクティブデータソースであるため、最初に空にレンダリングしてから、データが到着したときに更新することを期待してください。

独自の関数を使用する場合は、リアクティブデータソースにも依存するように記述し、そのようMeteor.autorunなデータソースが変更されたときに確実に再実行されるようにするのが最善です。

ページが読み込まれた後に実行するコードを常に内部Meteor.startupに配置してください。そうしないと、コードの実行時にMeteorを使用できなくなるリスクがあります。

これが私があなたのコードを書き直す方法です:

Messages = new Meteor.Collection("messages");
if (Meteor.isClient){
  Meteor.startup(function() {
    // anything you need to do, like subscriptions 
  });
  Template.temple.loading = function() {
    return Messages.find().count === 0 ? "Loading..." : "";
  }
  Template.temple.messages = function() {
    var messages = Messages.find();
    if (messages.count() > 0) return messages;
  }
}

<template name="messages">
  {{loading}}
  {{#each messages}}
    {{message}}<br>
  {{/messages}}
</template>

クライアントMeteor.subscribeで使用しているだけの場合は、実際にメッセージを呼び出す必要はありません。Messages.find()

于 2013-01-26T14:54:48.743 に答える
1

通常、サブスクリプションが読み込まれるまで、読み込みインジケーターを表示します。例については、これを参照してください: Meteorjs 読み込みメッセージ

サーバー側からコレクションを公開するには:

if (Meteor.isServer) {
  Meteor.publish("messages", function () {
    return Messages.find(); // everything
  );
}
于 2013-01-26T02:15:53.720 に答える