この概念に関するこの投稿を理解するため を試しましたが、それを取得できませんでした。次の簡単なセットアップがあります。
/server/test.js
Meteor.methods({
abc: function() {
var result = {};
result.foo = "Hello ";
result.bar = "World!";
return result;
}
});
/client/myapp.js
var q = Meteor.call('abc');
console.log(q);
この構造は、コンソールundefined
に戻ります。
myapp.js
ファイルを次のように変更した場合:
Meteor.call('abc', function(err, data) {
!err ? console.log(data) : console.log(err);
}
コンソールでObject
を受け取ります。
理想的には、これは私ができるようにしたいことですが、コンソールに次のように述べて機能しません:Cannot read property 'greeting' of undefined
/client/myapp.js
var q = Meteor.call('abc');
Template.hello.greeting = function() {
return q.foo;
}
サーバーオブジェクトからテンプレートにデータを渡す際に助けていただければ幸いです。私はまだJavaScriptとMeteorを学んでいます。
ありがとう!
From the Meteor.call
ドキュメント :
クライアントでは、コールバックを渡さず、スタブ内にいない場合、呼び出しは未定義を返し、メソッドの戻り値を取得する方法はありません。これは、クライアントにファイバーがないため、メソッドのリモート実行をブロックする方法が実際にはないためです。
したがって、次のようにする必要があります。
Meteor.call('abc', function(err, data) {
if (err)
console.log(err);
Session.set('q', data);
});
Template.hello.greeting = function() {
return Session.get('q').foo;
};
これにより、データが使用可能になると、テンプレートが事後的に更新されます。
これは、_Npm.require
_に非同期動作があるために発生します。 _Meteor.call
_のコールバックを作成する必要があるのはそのためです。
しかし、解決策があります。install(mrt add npm)
を使用するだけで、Meteor.sync(//...)
という名前の関数を取得できます。これにより、Meteor.call()
で同期と非同期の両方のゲームを実行できます。 。
参照: http://www.sitepoint.com/create-a-meteor-app-using-npm-module/
私はゲットーの解決策に行きました。しかし、それは私にとっては重要です。以下は私のコードで、概念的にはOPの問題を解決すると思います。
クライアントのmain.jsで:
Meteor.setInterval(function() {
confirmLogin();
}, 5000);
これにより、confirmLogin()関数が5秒ごとに実行されます。
ConfirmLogin関数(クライアントのmain.js内):
function confirmLogin() {
Meteor.call('loggedIn', function (error, result) {
Session.set("loggedIn", result);
});
}
LoggedInメソッド(サーバーのmain.js内):
loggedIn: function () {
var toReturn = false;
var userDetails = Meteor.user();
if (typeof userDetails["services"] !== "undefined") {
if (typeof userDetails["services"]["facebook"] != "undefined") {
toReturn = true;
}
}
return toReturn;
},
関連するヘルパー:
loggedIn: function () {
return Session.get("loggedIn");
}
reactive variable を使用して、テンプレートで使用するMeteorメソッドの戻り値を取得できます。 Meteorpadでの実演デモ をご覧ください