6

これは私の古い質問の新しいバージョンです:

Tom Coleman の助けのおかげで、サブスクリプションが ready() かどうかを適切にチェックする方法を最終的に見つけました。

私の現在のコード構造は次のようになります。

/client/app.js:

eventsHandle = null;
groupsHandle = null;
// ...
// First Deps.autorun():
// Does not depend on any Session var, should just run every time
Deps.autorun(function() {
    eventsHandle = Meteor.subscribe("events", function() {
        console.log('Deps.autorun(): Events loaded');
    });
});

// Second Deps.autorun():
// contains all subscriptions which are dependent on my Session var "ehash"
Deps.autorun(function() {
    if(Session.get('ehash'))
        groupsHandle = Meteor.subscribe("groups", Session.get('ehash'), function() {
            console.log('Deps.autorun(): Groups loaded with ehash: ' + Session.get('ehash'));
        });
});
// ...

次に、次のフォルダー内のすべてのテンプレート用の特定の .js および .html ファイルを表示します。

/client/views/
--> <page>.js:

Template.x.dataLoaded = function() {
    if(Session.get('ehash'))
        if(eventsHandle && groupsHandle && eventsHandle.ready() && groupsHandle.ready()) {
            console.log('All data loaded!');
            singleevent = Events.find({ehash: Session.get('ehash')}).fetch()[0];
            return true;
        } 
}

このヘルパーdataLoadedは、基本的にすべてを対応するテンプレートにラップし、dataLoadedtrue が返されたときにコンテンツを表示するか、ローディング スピナーを表示します。

問題は、この dataLoaded コードが 1 回しか実行されないため、多くの場合、これが機能しないことです。そのため、dataLoaded の実行時に 2 つのハンドルが ready() でない場合、コンテンツは決して表示されません。この場合、app.js ファイル (Deps.autorun() のもの) からのすべての console.log が引き続き表示されますが、「すべてのデータがロードされました!」というログが表示されます。エコーされることはありません。

だから私の質問は次のとおりです:このコードの再実行をトリガーして再dataLoaded実行して、コンテンツが最終的に表示されるようにするにはどうすればよいですか?

よろしくお願いします

4

4 に答える 4

8

この問題は、依存関係を作成するだけで解決できます。

var _dep = new Deps.Dependency();

Template.x.dataLoaded = function() {
    _dep.depend();
    ...
}


function handler() {
    ... do.stuff();
    _dep.changed();
}

これで、メソッドを実行するたび_dep.changed()に、ヘルパーが再実行されます。単純!

于 2013-08-13T18:13:49.993 に答える
0

これは必要以上に複雑に見えます。私は何かが欠けている可能性が非常に高いですが、データがロードされたときにローディングスピナーを設定しようとしているようです。Meteor で「読み込み中」を表示するシンプルで読みやすい方法を投稿しました。

于 2013-08-14T19:26:02.117 に答える
0

ready()メソッドを呼び出すにeventHandleは括弧が必要です。それ以外の場合は、ready メソッドが存在することを確認しているだけだと思います。これについての議論はここにあります。

eventHandleこれは、JavaScript のさまざまな部分でさまざまなサブスクリプション ハンドルに設定されている場合、問題が残る可能性があります。こちら で説明されているように、アプリのファイルを構造化してみてください。

于 2013-08-10T12:38:35.677 に答える
0

はい、this.ready()手動で呼び出す必要があります。ドキュメントの例を参照してください。

于 2013-08-13T06:37:32.353 に答える