我使用Twitter widgets.js
在我的Angular应用中的页面上嵌入了一些推文。他们已经工作了相当长的一段时间。我今天注意到他们突然停止了工作。我一直试图调试这个问题,但无论我尝试什么,我似乎无法加载推文。控制台中没有错误。如果我从控制台手动初始化推文,代码似乎正常执行。我可以通过在then
函数中将某些内容记录到控制台来验证这一点,该函数只有在twttr.widgets.createTweet()
返回的承诺得到解决时才会被调用。
在我application.html.erb
我有以下内容:
<!-- Twitter oEmbed Widget -->
<script>
window.twttr = (function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0],
t = window.twttr || {};
if (d.getElementById(id)) return t;
js = d.createElement(s);
js.id = id;
js.src = "https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);
t._e = [];
t.ready = function(f) {
t._e.push(f);
};
return t;
}(document, "script", "twitter-wjs"));
</script>
在我的指令模板中,我指定一个带有Tweet id的div,如下所示:
<div class="fade" ng-show="!loading" ng-if="post.provider === 'twitter'" id="{{'post_' + post.id}}"></div>
然后在我的指令控制器中,我在延迟后初始化窗口小部件,以确保DOM准备就绪,如下所示:
function loadWidget() {
if($scope.post.provider === 'twitter') {
$timeout(function() {
if(angular.element('#post_' + $scope.post.id).find('iframe').length === 0) {
twttr.widgets.createTweet($scope.post.twitter_id, document.getElementById('post_' + $scope.post.id)).then(function(resp) {
$timeout(function() {
$scope.loading = false;
})
});
};
}, 2500);
};
};
如果我在debugger
块中插入$timeout
,我可以看到angular.element('#post_' + $scope.post.id)
从DOM返回有效的div
。如果我去我的帐户,我也可以确认我的推文在推特上。
此设置现在已经运行了一段时间。我还没有做出任何改变。事实上它只是在几个小时前工作!我想知道的是我如何调试它并找出它突然停止工作的原因。我检查了Twitter API的状态,并说它在过去24小时内有100%的正常运行时间。
更新
我设法在jsFiddle中重现了这个问题。据我所知,我用来测试的帐户中的推文似乎有问题。正如您在小提琴中所看到的,我指定了两个推文ID - tweetA
和tweetB
- 然后嵌入它们。第一个是我的,无法加载。第二个加载得很好。