Asp.net mvc 如何使用这个coffeescript类正确地加载Facebook javascript SDK,并使其可由同一页面上的多个Facebook功能使用?
MyNamespace.Facebook.coffee: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
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初始化后用对象替换数组。然后我必须立即执行任何推到该对象上的操作。这将解决这两种情况。如果有人有更好的方法,请让我知道!