Asp.net mvc 如何使用这个coffeescript类正确地加载Facebook javascript SDK,并使其可由同一页面上的多个Facebook功能使用?

Asp.net mvc 如何使用这个coffeescript类正确地加载Facebook javascript SDK,并使其可由同一页面上的多个Facebook功能使用?,asp.net-mvc,facebook-javascript-sdk,Asp.net Mvc,Facebook Javascript Sdk,MyNamespace.Facebook.coffee: namespace 'MyNamespace', (exports) -> exports.FacebookAPILoader = class constructor: (@appId, @channelFileUrl) -> @init() init: (fbAPILoadedCallback) -> #FB trigg

MyNamespace.Facebook.coffee:

namespace 'MyNamespace', (exports) -> 
    exports.FacebookAPILoader = class 

        constructor: (@appId, @channelFileUrl) -> 
            @init()

        init: (fbAPILoadedCallback) -> 
            #FB triggers/calls window.fbAsyncInit() after the API javascript loads: 
            window.fbAsyncInit = () => 
                @initFb()
                fbAPILoadedCallback() if fbAPILoadedCallback?
                return
            @loadAPI()

        loadAPI: () -> 
            ((d) ->
                id = 'facebook-jssdk'
                ref = d.getElementsByTagName('script')[0]
                return if d.getElementById id

                js = d.createElement 'script'
                js.id = id
                js.async = true
                js.src = "//connect.facebook.net/en_US/all.js"
                ref.parentNode.insertBefore js, ref
            )(document)

        # Set app specific settings here: 
        initFb: () -> 
            fbConfig = 
                appId: @appId
                channelUrl: @channelFileUrl
                status: true
                cookie: true
                xfbml: true
            FB.init fbConfig 
以下是我在视图中加载api的方式: //MyView.cshtml:

@using (Script.Foot()) {
    var settingsReader = new System.Configuration.AppSettingsReader();
    var facebookAPIAppId = settingsReader.GetValue("Facebook_API_AppId", typeof(string));
    var hostName = settingsReader.GetValue("EnvHostname", typeof(string));

<script type="text/javascript">
    var myFb;
    $(document).ready(function () {
        myFb = new MyNamespace.FacebookAPILoader(
            '@Html.Raw(facebookAPIAppId)'
            , '//@Html.Raw(hostName)/modules/myapp/channel.html'
        );
    });
</script>
}
Jquery在结束标记之前加载。我有两个问题:

我在这里装东西的方式有什么问题吗?我相信它会在jquery触发文档“ready”事件后异步加载-对吗?有没有更好的方法来实现这一点

设置此模块的最佳方法是什么,以便传入将在FBAsyninit中执行的任意回调?我在CMS Orchard驱动的网站中使用它,我可能在同一个HTTP请求中有多个视图想要添加它们自己的自定义回调,这些回调应该作为FBAsyncint的一部分运行。我如何做到这一点?我知道我可以传入一个回调数组,但我不确定的是如何确保给定页面上的所有不同功能都能与他们的Facebook相关代码相呼应,以及如何确保FacebookAPILoader.init仅在所有FB小部件的回调和DOM元素以及所有与之交互的准备就绪后运行

更新:
我想我会用google analytics async tracking在全局名称空间中使用_gaq变量的方法来实现这一点。任何需要FacebookAPI交互的代码都可以将回调推送到_gaq样式的队列中,FacebookAPILoader模块将在队列准备就绪时拉入该队列。这是天真的做法吗?在调用fbAPILoadedCallback之后,我的代码是否会尝试添加到_gaq样式的队列中

我找到了,我认为这是迄今为止我遇到的解决这个问题的最好办法。只要您不介意依赖jQuery,就比_gaq样式的队列更容易实现

根据这里的push函数文档,我必须在FacebookAPILoader初始化后用对象替换数组。然后我必须立即执行任何推到该对象上的操作。这将解决这两种情况。如果有人有更好的方法,请让我知道!