Javascript 在AngularJS中,如果对远程资源的响应状态为403(禁止),如何隐藏DIV

Javascript 在AngularJS中,如果对远程资源的响应状态为403(禁止),如何隐藏DIV,javascript,jquery,angularjs,angularjs-directive,Javascript,Jquery,Angularjs,Angularjs Directive,我的页面上有一个社交媒体评论框,我正在使用Angular加载它。不幸的是,在某些网络上,此框被网络管理员阻止,并在其位置显示一个丑陋的错误。我想检测社交媒体站点是否被阻止,如果是,我想向用户显示一条更友好、更好看的错误消息 我在做这件事时遇到了一些问题 首先,如果我遇到错误,“状态”返回为“未定义”: app.directive('dynFbLike', function ($http) { function createHTML(href, layout, action, showfa

我的页面上有一个社交媒体评论框,我正在使用Angular加载它。不幸的是,在某些网络上,此框被网络管理员阻止,并在其位置显示一个丑陋的错误。我想检测社交媒体站点是否被阻止,如果是,我想向用户显示一条更友好、更好看的错误消息

我在做这件事时遇到了一些问题

首先,如果我遇到错误,“状态”返回为“未定义”:

app.directive('dynFbLike', function ($http) {
    function createHTML(href, layout, action, showfaces, share) {
    $http.jsonp('//graph.socialmediasite.com/APIKEYWASHERE').
        success(function () {
            console.log('Loading "Like" badge...');
                return '<div class="fb-like" ' +
                               'data-href="' + href + '" ' +
                               'data-layout="' + layout + '" ' +
                               'data-action="' + action + '" ' +
                               'data-show-faces="' + showfaces + '" ' +
                               'data-share="' + share + '">' +
                       '</div>';
        }).
        error(function (status) {
            console.log('Status: ' + status);
            if (status == 403)
            {
                var errorMessage = 'This comments box is not accessible.  Please contact your network administrator for further information.';
                console.log(errorMessage);
                return errorMessage;    
            }
        });
    }

    return {
        restrict: 'A',
        scope: {},
        link: function postLink(scope, elem, attrs) {
            attrs.$observe('pageHref', function (newValue) {
                var href        = newValue;
                var layout    = attrs.layout    || 'box_count';
                var action = attrs.action || 'like';
                var showfaces = attrs.showfaces || 'true';
                var share = attrs.share || 'true%';
                elem.html(createHTML(href, layout, action, showfaces, share));
                FB.XFBML.parse(elem[0]);
            });
        }
    };
});
app.directive('dynFbLike',函数($http){
函数createHTML(href、布局、操作、showfaces、共享){
$http.jsonp('//graph.socialmediasite.com/APIKEYWASHERE')。
成功(功能(){
log('load'像“badge…”);
返回“”+
'';
}).
错误(功能(状态){
console.log('状态:'+状态);
如果(状态==403)
{
var errorMessage='无法访问此评论框。请与网络管理员联系以获取更多信息';
控制台日志(错误消息);
返回错误消息;
}
});
}
返回{
限制:“A”,
作用域:{},
链接:函数postLink(范围、元素、属性){
属性$observe('pageHref',函数(newValue){
var href=newValue;
var layout=attrs.layout | |“盒子计数”;
var action=attrs.action | |“like”;
var showfaces=attrs.showfaces | |“true”;
var share=attrs.share | |“真%”;
html(createHTML(href、布局、操作、展示、共享));
FB.XFBML.parse(elem[0]);
});
}
};
});

其次,在我将逻辑放入查看特定错误消息之前,错误消息没有插入页面。

简单的答案是在模板中使用
ng hide
(或
ng show
)绑定到默认设置为false的范围中的属性。如果从服务中获得403,则将属性设置为true

以下是ng show的一个简单演示:

您应该查看

错误回调实际上将
数据
作为第一个参数,将
状态
作为第二个参数:

$http.jsonp('//graph.socialmediate.com/APIKEYWASHERE')。
成功(函数(数据、状态、标题、配置){
//将异步调用此回调
//当响应可用时
}).
错误(函数(数据、状态、标题、配置){
//发生错误时异步调用
//或服务器返回带有错误状态的响应。
}
);

您使用的是哪个版本的AngularJS?错误403由您的服务器返回,而不是由admins1.3.0-beta.13返回(与beta.10中的行为相同)@patxy否,返回403错误,因为代理阻止了到外部资源的通信。如果我在连接到不同网络时发出相同的请求,我不会收到403错误。@eat sleep code抱歉,我正在考虑防火墙阻止您的IPThanks!我确实给它添加了数据。现在它吐回404而不是Chrome显示的403。奇怪。@eat sleep代码尝试在Firefox中检查状态代码,并使用curl或其他命令行工具确认这不是浏览器问题?如果是浏览器而不是JSON请求,他们可能会检查浏览器并返回403?您也可以尝试使用
$http.jsonp
以外的其他方法?我愿意接受这些想法。我切换到$http.jsonp,因为我试图绕过愚蠢的跨域源问题。@MilenIgrachev——不是真的。我用叉子叉了你的车,你的控制器坏了,所以我把它删除了。