通过FB.Event.subscribe订阅的方法不会触发comment.create或comment.remove

时间:2011-09-12 11:03:35

标签: javascript asp.net-mvc facebook

我在MVC应用程序中有一个局部视图,我想显示一个Facebook评论框。我还想在我的数据库中为用户发布的每条评论保存信息 - 是的,我知道它们在Facebook上也可见,但我需要将它们保存在数据库中。

为此,我编写了这段代码(注意:这是我在部分视图中的所有代码,我试图将其拆分为更具可读性。此外,正确插入了应用程序密钥。):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<div id="fb-root">
</div>
<script type="text/javascript">
window.fbAsyncInit = function ()
{
    FB.init({ appId: 'MY_APP_KEY', status: true, cookie: true, xfbml: true }); console.log('fb init');
    FB.Event.subscribe('comment.create',
        function (response)
        {
            console.log("comment created");
            var commentQuery = FB.Data.query("SELECT text, fromid FROM comment WHERE post_fbid='" + response.commentID +
                "' AND object_id IN (SELECT comments_fbid FROM link_stat WHERE url='" + response.href + "')");
            var userQuery = FB.Data.query("SELECT name FROM user WHERE uid in (select fromid from {0})", commentQuery);
            FB.Data.waitOn([commentQuery, userQuery], function ()
            {
                var commentRow = commentQuery.value[0];
                var userRow = userQuery.value[0];
                console.log(userRow.name + " (id: " + commentRow.fromid + ") posted the comment: " + commentRow.text);
                trackcomments(response['commentID'], response['href'], 'create', commentRow.text, userRow.name, commentRow.fromid);
            });
        });
    FB.Event.subscribe('comment.remove',
        function (response)
        {
            console.log("comment removed");
            trackcomments(response['commentID'], response['href'], 'remove', null, null, null);
        });
};
(function ()
{
    var e = document.createElement('script');
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js#xfbml=1';
    e.async = true; document.getElementById('fb-root').appendChild(e);
} ()
    );

trackcomments功能:

function trackcomments(_commentid, _address, _action,
 _commentMessage, _userName, _userId)
{
    $.ajax({
        type: 'POST',
        url: '/trackcomments',
        data:
             {
                 commentId: _commentid,
                 pageUrl: _address,
                 actionTaken: _action,
                 userName: _userName,
                 userId: _userId,
                 commentMessage: _commentMessage
             },
        success: function (result)
        {
            console.log("successfully received callback");
        }
    });
}
</script>

以及facebook评论标签,就在上面的代码下面:

    <fb:comments notify="true" href="<%= Request.Url.ToString() %>" num_posts="3" width="630"></fb:comments>

问题在于每次发布(或删除)评论时,都不会触发这些功能。我看到的唯一控制台日志文本是“fb init”。显然,服务器上也没有任何事情发生。

过去两天我一直在摸不着头脑,但我似乎无法找到答案 - 我会非常感谢任何可以指引我朝正确方向前进的人。

谢谢!

3 个答案:

答案 0 :(得分:1)

您应该将与FB。[...]函数(FB.init,FB.Event.suscribe,...)相关的所有内容放在

window.fbAsyncInit = function(){
    // Your code
});

否则你的代码将在FB js sdk完全加载之前被解析,你永远不会真正地对你的事件进行抄袭

答案 1 :(得分:0)

您需要确保添加notify="true"标记,如果这不适合您,请确保您使用的是最新的fbComments插件。尝试添加migrated="1"标记,如下所示,看看是否有帮助:

<fb:comments notify="true" migrated="1"></fb:comments>

答案 2 :(得分:0)

我今天遇到了同样的问题,并设法解决了这个问题。我的问题是我有2个不同的fbAsyncInit注册。一旦我将它们合并,我就开始接收评论通知。

获取评论通知时无需“notify = true”参数。

错误:

window.fbAsyncInit = function(){
    // Init and Authenticate
});

window.fbAsyncInit = function(){
    // Comment Event Subscribe.
});

右:

window.fbAsyncInit = function(){
    // Init and Authenticate
    // Comment Event Subscribe.
});