【发布时间】:2015-01-14 23:52:27
【问题描述】:
目标 - 为 Facebook 提供分享按钮
我遇到过各种各样的问题,我已经设法解决了大多数问题,但从来没有同时解决所有问题。
- ReferenceError: FB 未定义(控制台出错)
- “FB 初始化函数给出错误版本错误”(控制台错误)
- 我的按钮在转换到另一条路线后没有呈现。
- 我的按钮呈现,但按钮周围与初始路线上的相邻内容没有间距
关于渲染问题(- / 连字符用于注意间距问题)
- 第一次渲染:
- 第二次以上渲染:
我学到了什么:
- Facebook 希望
<div id="fb-root"></div>作为<body>中的第一个元素 -
FB.XFBML.parse()可以在 didInsertElement 之后调用以在过渡后渲染组件
我尝试了 JSBin 样板,它目前卡在未定义的 FB 错误中。
部分答案我也很感兴趣:
- 了解解决方案至少必须有多么复杂才能获得好的结果(“它必须包含一个初始化程序和一个视图/组件!”或“您可以通过...解决这个问题”)
可能有用的部件
一篇关于“FB.init()之后”的帖子
初始化器
/* global FB */
export default {
name: 'facebook',
initialize: function() {
var fbAsyncInit = function() {
FB.init({
appId : 123,
xfbml : true,
version : 'v2.2'
});
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
window.fbAsyncInit = fbAsyncInit;
}
};
一个组件
/* global FB */
import Ember from 'ember';
export default Ember.Component.extend({
tagName: 'div',
classNames: 'fb-like',
attributeBindings: [
'data-href',
'data-layout',
'data-action',
'data-show-faces',
'data-share'
],
onDidInsertElement: function() {
Ember.run.schedule('afterRender', FB.XFBML.parse);
}.on('didInsertElement'),
init: function() {
Ember.run.schedule('afterRender', FB.XFBML.parse);
}
});
脚本标签
<script type="text/javascript" src="//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=123&version=v2.2"></script>
facebook 要求的根 div
<div id="fb-root"></div>
【问题讨论】:
-
我只是偶然发现了您的问题,因为我正在寻找相同的答案。您应该使您的 Initializer 异步,这可以确保在您的 Ember 应用程序启动之前定义全局
FB。这篇博文应该对您有所帮助:ember.zone/ember-application-initializers/… -
谢谢,它可能已经解决了一切!这也许可以解释为什么由于缓存等原因,第一次加载与第二次加载不同。据我测试,这解决了我的问题,但我总体上感到困惑。
标签: twitter ember.js facebook-javascript-sdk facebook-like ember-cli