2011-12-05 11 views
1

私はCoffeescriptを使用しており、Facebook JS APIをドキュメントに示唆しているように非同期的に読み込んでいます。これと同じように:windowに添付FacebookのものでCoffeescript、Facebook JS APIとスコープ

#Load the FB api asynchronously 
(-> 
    e = document.createElement("script") 
    e.async = true 
    e.src = document.location.protocol + "//connect.facebook.net/en_US/all.js" 
    document.getElementById("fb-root").appendChild e 
)() 

doSomething =() -> 
    # I'd like to call this from the FB context 

window.fbAsyncInit = -> 
    FB.init 
    appId: fb_app_id 
    status: true 
    cookie: true 
    xfbml: true 
    oauth: true 

    # Doesn't work. Is out of scope. 
    doSomething() 

、私はCoffeeScriptの者の匿名のラッパー関数のコンテキストでのものにアクセスすることはできません。

私はwindow.doSomething()として機能を定義できますが、これが最善の方法であるかどうかはわかりません。

Coffeescriptの匿名ラッパー関数のコンテキスト内でFacebookの読み込みを行う方法はありますか?

+0

発生しているエラーはなんですか? –

答えて

1

あなたは、グローバル名前空間を汚染してはならないと考えています。クリーンな環境を継続する方法の1つは、クラスを使用して、そこにあなたのFacebook固有の機能を維持することです。

これは、あなたが始めるのに役立つかもしれない:

class MyFacebookApp 
    constructor: -> 
    doSomething:() -> 
    console.log "I'm doing something over here." 

window.myFacebookApp = new MyFacebookApp() 
window.fbAsyncInit = -> 
    FB.init 
    appId: fb_app_id 
    status: true 
    cookie: true 
    xfbml: true 
    oauth: true 

    myFacebookApp.doSomething() 

幸運!

1

これは範囲の問題ではありません。コンパイルされたJSを見ると、ファイルの先頭にvar doSomethingが宣言されています。さらに、doSomethingwindow.FBAsyncInitの前に適切な値に設定されます。

関連する問題