10

Meteor Collection からデータを取得しようとしているときにいくつかの問題があり、アドバイスが必要です。

コレクションが正常に定義、公開、およびサブスクライブされました。データをテンプレートに送信すると、問題なく表示されます。

Template.Lists.Projects = function(){
    return Projects.find();
};

しかし、データを表示する前に使用しようとしていますが、ここで問題が発生します。まず、find() と findOne() の間に矛盾があります。find(selector) は正常に動作し、カーソルを返しますが、findOne(selector) は「未定義」を返します。私は本当に 1 つのエントリしか探していないので、find() は必要ないようです。

LocalCollection.Cursor を返します。

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"});
console.log(find);

未定義を返します:

var find = Projects.findOne({_id: "3fd33eed-9735-4376-860e-3be383beae2f"});
console.log(find);

次の問題は、LocalCollection.Cursor で .fetch() を使用するときに発生します。空の配列を返します。

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"});
var fetch = find.fetch();
console.log(fetch);

これが返すのは次の行だけです。

[ ]

表示したい配列から特定のキーを指定しようとすると、次のようになります。

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"});
var fetch = find.fetch();
console.log(fetch.name);

未定義を返します。

私はまだ Meteor に慣れていて、MongoDB (または minimongo) を使用したことがないので、おそらく愚かな間違いを犯しているだけです。誰かが私にそれを指摘することができれば、私はわくわくします!

4

5 に答える 5

4

find()とfindOne()の結果は一貫しています。基本的に、Mongoまたはminimongoは、その_idに一致するドキュメントを単に見つけていません。FindOne()は、find(selector、options).fetch()[0]を実行するのとまったく同じです。

Lists.Projectsテンプレートは、反復可能なコレクション、配列、またはハッシュを想定している可能性があります。特定のドキュメントを1つ返すことはできません。{{#each Projects}}を使用している場合は、単一の値だけでなく、テンプレートが反復する方法を提供する必要があります。

于 2012-12-21T09:19:52.073 に答える
0

クライアントで作業していて、クライアントが必要なすべてのデータをいつ取得したかわかりません。コレクションが空であるか、まだ同期が完了していない場合に、関数を起動できます。したがって、ミニモンゴに遅延リクエストを行う必要があります(すべてのデータがローカルで利用できる場合)

はい、getElementById()または何かを介して DOM でレンダリングされていない場合はアクセスできませんが、あなたの場合、DOM ではなく minimongo (ブラウザーのローカル mongodb バージョン) からデータにアクセスしようとするため、ここではテンプレートは重要ではありません。

サブスクリプションの準備が整うまで待って、ミニモンゴがサブスクリプションonReady呼び出しのコールバックですべてのデータを所有し、関数を起動します。

https://docs.meteor.com/api/pubsub.html#Meteor-subscribe

コールバック(関数またはオブジェクト)。

オプション。onStopおよびonReadyコールバックを含めることができ ます。エラーが発生した場合は、引数として onStop に渡されます。オブジェクトの代わりに関数が渡された場合、onReady コールバックとして解釈されます。

于 2017-04-24T10:23:39.070 に答える
0

自動公開を削除した場合、公開名を使用せずにコレクションをすべてのユーザーに公開するとどうなりますか?

Meteor.publish null, ->
    Products.find {}

あなたのコレクションはどこで購読していますか?

テンプレートヘルパー

Handlebars.registerHelp = 'products', (id) ->
    Product.find _id: Session.get 'productId'

各製品に価格がある場合のように。テンプレート部分は次のようになります...

<template name="products-list">
    <div class="products-list">
        {{#each products}}
            {{> product-item}}
        {{/each}}
    </div>
</template>

<template name="product-item">
    <div class="product-item">
        {{price}}
    </div>
</template>

js の部分は、coffeescript を使用します...

Template['product-item'].price = ->
    console.log @ # @ is this as it is product itself, if we have product inserted.
    console.log this
    return 'the price is: ' + @price
于 2012-12-18T22:37:08.107 に答える