web-dev-qa-db-ja.com

Meteor.Callを取得してテンプレートの値を返す方法は?

この概念に関するこの投稿を理解するため を試しましたが、それを取得できませんでした。次の簡単なセットアップがあります。

/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を学んでいます。

ありがとう!

41
rs77

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;
};

これにより、データが使用可能になると、テンプレートが事後的に更新されます。

77
Tamara Wijsman

これは、_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");
}
0
MastaBaba

reactive variable を使用して、テンプレートで使用するMeteorメソッドの戻り値を取得できます。 Meteorpadでの実演デモ をご覧ください