42

この概念に関するこの投稿を理解しようとしましたが、理解できませんでした。次の簡単な設定があります。

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

ありがとう!

4

4 に答える 4

78

ドキュメントから:_Meteor.call

クライアントでは、コールバックを渡さず、スタブ内にいない場合、call は undefined を返し、メソッドの戻り値を取得する方法がありません。これは、クライアントにファイバーがないためです。そのため、メソッドのリモート実行をブロックする方法は実際にはありません。

したがって、次のようにします。

Meteor.call('abc', function(err, data) {
  if (err)
    console.log(err);

  Session.set('q', data);
});

Template.hello.greeting = function() {
  return Session.get('q').foo;
};

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

于 2012-05-20T21:58:34.083 に答える
0

私はゲットーソリューションを求めました。しかし、それは私にとって重要なことであり、私にとってはうまくいきます。以下は私のコードです。概念的には、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");
}
于 2016-01-21T00:30:08.253 に答える