2012-05-20 4 views
41

私はto understand this post regarding this conceptを試しましたが、私はそれを手に入れません。私は以下の簡単なセットアップを持っています: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を学んでいます&流星。

ありがとうございます! the Meteor.call documentationから

答えて

77

:クライアントで

、あなたがコールバックを渡さないと、あなたはスタブ内でない場合、呼び出しは未定義戻り、あなたがの戻り値を取得する方法がありませんでしょう方法。これは、クライアントにはファイバーがないため、実際にはメソッドのリモート実行でブロックできない方法がないからです。

だから、あなたはこのようにそれをしたいでしょう:データが利用可能になると

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

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

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

これは、反応性テンプレートを更新します。

+1

こんにちはトム、あなたの迅速な応答をありがとう!私はあなたのMeteor.call関数を ');'で閉じて、最後に 'Template.hello.greeting'関数の最後にセミコロンを追加しなければなりませんでした(コードを編集したい場合)。あなたの助けをもう一度ありがとう! – rs77

+0

ああ、小さな間違い、訂正された答え。楽しんでください:) :) –

+1

こんにちはTom、簡単な質問 - データが長期間に渡って変更されることが予想されない場合、セッションオブジェクトを使用せずに行う方法はありますか?変数の数が増えるにつれて、非常に無駄で冗長であるように見えます。ありがとうございました。 –

1

これは、Npm.requireに非同期動作があるために発生します。そのため、Meteor.callのコールバックを作成する必要があります。

を使用すると解決策があり、Meteor.sync(//...)という名前の関数が得られます。Meteor.call()では、同期と非同期の両方のゲームを実行できます。

参考:http://www.sitepoint.com/create-a-meteor-app-using-npm-module/

0

あなたはreactive variableを使用して、テンプレートで使用するための流星メソッドの戻り値を取得することができます。チェックアウト:working demonstration on Meteorpad

+0

Meteorpadの例は私のためには機能しません。また、このサンプルをデプロイすると、...のように動作します。つまり、それは一度は動作しますが、私の場合は、基礎となる情報が更新されたときにメソッドが呼び出されません。 – MastaBaba

+1

メソッド自体は反応的ではありませんが、Template.instance()。autorun()やテンプレートヘルパーなどの反応的なコンテキスト内から呼び出すことができます。 –

0

私はゲットーの解決に行きました。しかし、それは私のために働く、それは重要なことである。私のコードは、概念上、OPの問題を解決すると考えています。クライアントのmain.jsで

Meteor.setInterval(function() { 
    confirmLogin(); 

}, 5000); 

これはconfirmLogin()関数で、5秒ごとに実行されます。

(クライアントのmain.js内)confirmLogin機能:

function confirmLogin() { 
    Meteor.call('loggedIn', function (error, result) { 
     Session.set("loggedIn", result); 
    }); 

} 

LOGGEDIN方法(サーバーのメインインチ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"); 
} 
関連する問題