0

私は meteor を学習して、1 つのコレクション (のセット) から情報を取得する簡単なアプリを作成し、そのコレクションから返されたもの (アイテム、名前、アイテム ID の大きなリスト) に基づいて、別のコレクションでルックアップを行います。アイテム名私の考えでは、アイテム コレクションは大きく、クライアントが直接アクセスする必要がないため、サーバー上でのみ公開されるというものでした。

コールバックを正しく処理したとは思わないことを除いて、多かれ少なかれすべてが機能します。これが私が書いた簡単なテストです。アイテムの名前を渡すテンプレート:

Template.operations.getTypeID = function(name) {
  result = "";
  console.log("Precall Logging name: ", name);
  console.log("Precall Logging result: ", result);

  result = Meteor.call('getID', name, function (error, result) {
    console.log("Async Logging in call: result: ", result);
  });

  console.log("Name is now", name);
  console.log("Result is now", result);

  return name;
}

これは、最終的に名前に基づいて ID を検索するサーバー上のメソッドです。

Meteor.methods({ 

        getID: function(itemName) {
            result = itemName + "_changed";
            console.log("server: getID result:", result);

            return result;
         }

});

HTML ファイルでテンプレートを呼び出す場所は次のとおりです。

<td>{{getTypeID name}}</td>

アプリを使用していると、メソッド getID が非同期のように呼び出されることがわかります。getID メソッドの結果は変更され、テンプレート内の他のエントリの後にコンソールに書き込まれます。コールバックで返された結果をテンプレートで使用できるように設定し、クライアントに返してページでレンダリングできるようにするにはどうすればよいですか?

更新:編集を行った後の console.log 出力は次のとおりです。

Precall Logging name:  Apples lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Apples lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name:  Oranges lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Oranges lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name:  Melons lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Melons lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name:  Grapes lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Grapes lootlog.js:86
Result is now undefined lootlog.js:87
Precall Logging name:  Onion lootlog.js:79
Precall Logging result:   lootlog.js:80
Name is now Onion lootlog.js:86
Result is now undefined lootlog.js:87
Async Logging in call: result:  Apples_changed lootlog.js:83
Async Logging in call: result:  Oranges_changed lootlog.js:83
Async Logging in call: result:  Melons_changed lootlog.js:83
Async Logging in call: result:  Grapes_changed lootlog.js:83
Async Logging in call: result:  Onion_changed 

以下は、Meteor コンソールに表示される内容です。

server: getID Name: Apples
server: getID result: Apples_changed
server: getID Name: Oranges
server: getID result: Oranges_changed
server: getID Name: Melons
server: getID result: Melons_changed
server: getID Name: Grapes
server: getID result: Grapes_changed
server: getID Name: Onion
server: getID result: Onion_changed
4

2 に答える 2

0

データをテンプレートに転送するためにパラダイムを使用することはお勧めしません。ループする各アイテムについて、サーバーに対してMeteor.callを実行しているため、レイテンシが高い環境では処理速度が大幅に低下します。

テンプレートヘルパーには、クライアント側で同期的に実行できないMeteor.callが含まれているため、結果をなどのリアクティブ変数に渡す必要があります。この変数は、結果をSessionテンプレートに渡します。

多くの小さな呼び出しではなく、1つの呼び出しを行うことをお勧めします。以下のコードでは、名前の配列を使用して1つの呼び出しを使用しました。

サーバ

Meteor.methods({ 
        //Input variable is an array of names
        getID: function(itemNameArray) {
            result = {};  //Initialize an empty array

            itemNameArray.forEach(function(entry) {
                itemNameArray[entry] = entry + "_changed";
            });
            return result;
         }
});

クライアント

Template.operations.getTypeID = function(name) {
    Session.get("variables")[name];
}

Meteor.call('getID', ["Apples", "Oranges", "Grapes", "Onions"], function (error, result) {
    Session.set("variables", result);
});

繰り返しますが、何をしたいのか正確にはわかりませんが、名前を取得した場所のデータソースで配列を置き換えることができます。

Session.set / getリアクティブであるため、Meteorがサーバーからデータを取得するとすぐに、それに応じてテンプレートが更新されます。

于 2013-02-08T23:57:48.097 に答える
0

getIDのMeteor.call呼び出しの戻り値に変数を割り当ててみましたか?変数「name」を変更したいようですので、「name =Meteor.call...」を実行する必要があります。

于 2013-02-08T22:10:53.267 に答える