2012-05-20 18 views
41

मैंने to understand this post regarding this concept को आजमाया है, हालांकि, मैं इसे प्राप्त करने में विफल रहा हूं।मेटीर कैसे प्राप्त करें। टेम्पलेट के लिए मूल्य वापस करने के लिए कॉल करें?

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

में सर्वर ऑब्जेक्ट से डेटा पारित करने में कोई मदद टेम्पलेट की सराहना की जाएगी। मैं अभी भी जावास्क्रिप्ट & उल्का सीख रहा हूँ।

धन्यवाद!

उत्तर

77
the Meteor.call documentation से

:

ग्राहक, यदि आप एक कॉलबैक उत्तीर्ण नहीं होते हैं और आप एक ठूंठ के भीतर नहीं हैं, कॉल अपरिभाषित वापस आ जाएगी, और आप के रिटर्न मान प्राप्त करने के लिए कोई रास्ता नहीं होगा तरीका। ऐसा इसलिए है क्योंकि क्लाइंट में फाइबर नहीं होते हैं, इसलिए वास्तव में किसी भी तरीके से यह किसी विधि के दूरस्थ निष्पादन पर अवरुद्ध नहीं हो सकता है। प्रतिक्रिया के रूप में टेम्पलेट अद्यतन करेगा डेटा उपलब्ध होने पर

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 फ़ंक्शन को ') के साथ बंद करना पड़ा था, और' टेम्पलेट.हेल्लो.greeting' फ़ंक्शन के अंत में अर्ध-कॉलन को अंततः काम करने के लिए (यदि आप अपना कोड संपादित करना चाहते थे) को अंत में जोड़ना चाहते थे। आपकी सहायता के लिए एक बार फिर से धन्यवाद! – rs77

+0

ओह woops, छोटी गलतियों, सही जवाब। मज़े करें ... :) –

+1

हाय टॉम, त्वरित प्रश्न - यदि डेटा सभी लंबी अवधि में बदलने की उम्मीद नहीं है, तो क्या सत्र ऑब्जेक्ट का उपयोग किए बिना ऐसा करने का कोई तरीका है? चरम संख्या बढ़ने के कारण अन्यथा बहुत अपमानजनक और verbose लगता है। धन्यवाद। –

1

ऐसा इसलिए होता है क्योंकि Npm.require में Async व्यवहार है। यही कारण है कि आपको Meteor.call के लिए कॉलबैक लिखना है।

लेकिन एक समाधान है, बस install(mrt add npm) का उपयोग करें और आपको 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

तरीके स्वयं प्रतिक्रियाशील नहीं हैं, लेकिन टेम्पलेट.instance()। Autorun() या टेम्पलेट सहायक जैसे प्रतिक्रियाशील संदर्भ में से कॉल किया जा सकता है। –

0

देखें, मैं एक यहूदी समाधान के लिए गया था। लेकिन, यह मेरे लिए काम करता है, जो मेरे लिए मायने रखता है। नीचे मेरा कोड है, जो, अवधारणा में, मुझे लगता है, ओपी की समस्या हल करता है।

ग्राहक की main.js में:

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

}, 5000); 

यह confirmLogin() फ़ंक्शन हर पांच सेकंड चलाता है।

confirmLogin समारोह (ग्राहक की main.js में):

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

} 

loggedIn विधि (सर्वर के मुख्य में।जे एस):

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"); 
} 
संबंधित मुद्दे

 संबंधित मुद्दे