2012-08-07 11 views
11

के साथ require.js का उपयोग करके मैं requ.js का उपयोग करके एफबी एसडीके लोड करना चाहता हूं।एफबी एसडीके

test.js:

require([   
    'libs/facebook/fb' 
    ], function(FB){ 
    FB.api("/me", function(){}); 
)); 

मैं test.js चलाने के बाद ही अमेरिकन प्लान एसडीके भरी हुई है, और के लिए अमेरिकन प्लान तैयार करना चाहते हैं

अपने परीक्षण मामले कुछ इस तरह है यह।

इस पर कोई विचार कैसे प्राप्त किया जा सकता है? मेरे रैपर (libs/facebook/fb.js) क्या होना चाहिए?

+1

लग रहा है फेसबुक की तरह अंत में इस संबोधित किया, उनके समाधान काफी में से कुछ के समान दिखता है इस सवाल पर जवाब। https://developers.facebook.com/docs/howto/javascript/requirejs/ – the0ther

उत्तर

10

ऐसा लगता है कि एफबी एपीआई एक एएमडी मॉड्यूल नहीं है, इसलिए यह खुद को परिभाषित नहीं करता है जिसकी आवश्यकता जेएसई का आदी है। आपको require.config का उपयोग करके एफबी एपीआई को तैरने की आवश्यकता होगी। मुझे लगता है test.js वह स्क्रिप्ट है जिसे आपने RequJS के लिए डेटा-मुख्य मान के रूप में प्रदान किया है।

require.config({ 
    shim: { 
     'facebook' : { 
      exports: 'FB' 
     } 
    }, 

    paths: { 
     'facebook' : 'libs/facebook/fb' 
    } 
}); 

require(['facebook'], function(FB){ 
    FB.api('/me', function(){}); 
}); 
+0

क्या आप शायद इस उत्तर में अधिक जानकारी जोड़ सकते हैं? Libs/facebook/fb क्या होना चाहिए? 'FB.init()' कोड? 'Https: // connect.facebook.net/en_US/all/debug.js' का संदर्भ? –

+1

libs/facebook/fb fb मॉड्यूल का पथ है, या इस मामले में fb।जेएस फ़ाइल। RequJS मानता है कि सबकुछ एक मॉड्यूल है, और आपको फ़ाइल पथ के .js भाग को शामिल करने की आवश्यकता नहीं है। यह स्वयं ही इसका पता लगाएगा। –

+0

क्षमा करें, अभी भी थोड़ा उलझन में है। क्या आपका मतलब यह इस फ़ाइल की एक शाब्दिक प्रति है: https://connect.facebook.net/en_US/all.js? यदि ऐसा है तो init कोड कहां जाता है? बस लाइब्रेरी को लोड करना 'FB.api() ' –

3

या (नमूना डोजो का उपयोग करता है) एक मॉड्यूल में init कोड लपेट:

define('facebook', 
    [ 'dojo/dom-construct', 
     'dojo/_base/window', 
     'https://connect.facebook.net/en_US/all/debug.js' ], // remove "/debug" in live env 
    function(domConstruct, win) 
    { 

     // add Facebook div 
     domConstruct.create('div', { id:'fb-root' }, win.body(), 'first'); 

     // init the Facebook JS SDK 
     FB.init({ 
      appId: '1234567890', // App ID from the App Dashboard 
      channelUrl: '//' + window.location.hostname + '/facebook-channel.html', // Channel File for x-domain communication 
      status: true, // check the login status upon init? 
      cookie: true, // set sessions cookies to allow your server to access the session? 
      xfbml: true // parse XFBML tags on this page? 
     }); 


     // Additional initialization code such as adding Event Listeners goes here 
     console.log('Facebook ready'); 

     return FB; 
    } 
); 
+0

ऐसा लगता है कि यहां 'एफबी-रूट' तत्व जोड़ने के लिए कोड बहुत देर हो चुकी है, क्योंकि फेसबुक एसडीके उस div को लोड करने के बाद देखता है और यदि यह पहले से मौजूद नहीं है तो स्वचालित रूप से इसे बनाता है। –

+0

क्या आप शायद इस कोड को थोड़ा सा समझा सकते हैं? क्या यह 'एफबी' को 'विंडो' में जोड़ने से रोकता है? क्या @ ड्रैक हैम्पटन की टिप्पणी सही है? कोई अन्य प्रभाव? –

+0

मैं इस तरह से कुछ कर रहा हूं (सैन्स डोजो) लेकिन एफबी.init() ' –

1

बिल्डिंग पर voidstate's और Dzulqarnain Nasir's उत्तर, यहाँ कोड मैं अपने प्रोजेक्ट पर का उपयोग कर समाप्त हो गया है।

जिस हिस्से ने मुझे सबसे ज्यादा ट्रिप किया वह यह था कि FB.init() स्पष्ट रूप से असीमित है। callback() (FB.getLoginStatus के बिना) को हटाने की कोशिश में, FB अभी तक प्रारंभ नहीं हुआ था, और मुझे "An active access token must be used to query information about the current user." त्रुटियां मिल रही थीं।

RequireJS शिम कॉन्फ़िग

require.config({ 
    // paths: { 'facebookSDK': '//connect.facebook.net/en_US/all/debug' }, // development 
    paths: { 'facebookSDK': '//connect.facebook.net/en_US/all' }, // production 
    shim: { 'facebookSDK': { exports: 'FB' } } 
}); 

एएमडी मॉड्यूल प्रारंभ करने के लिए फेसबुक जे एस एसडीके

define(['facebookSDK'], function (FB) { 
    'use strict'; 

    return function (settings, callback) { 
     var args = { 
      appId: settings.appId, 
      channelUrl: settings.channelUrl, 
      status: true, 
      cookie: true, 
      xfbml: true 
     }; 

     console.log('Calling FB.init:', args); 
     FB.init(args); 

     if (callback && typeof (callback) === "function") { 
      // callback() // does not work, FB.init() is not yet finished 
      FB.getLoginStatus(callback); 
     }    
    }; 

}); 

यह अभी भी काफी मूल प्रश्न के वांछित उपयोग को संबोधित नहीं करता।

require(['libs/facebook/fb'], // where fb.js holds my above Module 
    function(FBinit){ 
    FBinit({ 
     appId: appId, 
     channelUrl: channelUrl 
    }, function(){ 
     FB.api("/me", function(){}); 
    }); 
    } 
); 

यह काफी ओपी के मूल अवधारणा cleanas के रूप में नहीं है, लेकिन अपने सबसे अच्छे रूप में मैं यह पता लगाने सकता है: के रूप में

ओपी के कोड हो सकता है फिर से लिखा जा सकता है। अगर किसी के पास कोई है, तो मुझे अपने दृष्टिकोण को बेहतर बनाने के बारे में कुछ प्रतिक्रिया या सलाह पसंद आएगी। मैं अभी भी RequJS के लिए बहुत नया हूँ। https://developers.facebook.com/docs/javascript/howto/requirejs/

require.config({ 
    shim: { 
    'facebook' : { 
     export: 'FB' 
    } 
    }, 
    paths: { 
    'facebook': '//connect.facebook.net/en_US/all' 
    } 
}) 
require(['fb']); 

और उसके बाद इस तरह मॉड्यूल जोड़ने:

3

यहाँ फेसबुक से एक प्रलेखन है

define(['facebook'], function(){ 
    FB.init({ 
    appId  : 'YOUR_APP_ID', 
    channelUrl : '//yourdomain.com/channel.html' 
    }); 
    FB.getLoginStatus(function(response) { 
    console.log(response); 
    }); 
}); 
+1

को एनवोक करते समय एफबी उपलब्ध नहीं है, एक संपादन को यह कहते हुए खारिज कर दिया गया था कि फेसबुक के मैनुअल में दावा करने के लिए एक टाइपो है ([ 'एफबी']); 'की आवश्यकता होनी चाहिए ([' फेसबुक ']); '। यह सच हो सकता है इसलिए यह एक टिप्पणी के योग्य है। – Popnoodles

+0

@ पॉपनूडल्स: "आवश्यकता (['एफबी']);" सही है। एफबी आपके द्वारा बनाई गई मॉड्यूल फ़ाइल का नाम है। – nfplee

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