2011-12-05 107 views
1

我正在使用Coffeescript,並且正在他們的文檔中建議的異步加載Facebook JS api。像這樣: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() 

與連接到window Facebook的東西,我不能在CoffeeScript中的匿名包裹函數上下文訪問的東西。

我知道我可以定義我的功能爲window.doSomething(),但我不確定這是否是最好的方法。

有沒有辦法讓Facebook的東西加載在Coffeescript的匿名包裝函數的上下文中?

+0

什麼是您遇到的確切錯誤? –

回答

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之前設置爲其適當的值。