Javascript 如何在AngularJS中管理404错误加载指令模板

Javascript 如何在AngularJS中管理404错误加载指令模板,javascript,angularjs,Javascript,Angularjs,在AngularJS指令中,templateUrl参数是按逻辑定义的 'templates/' + content_id + '.html' 我不想建立规则来检查content\u id值是否有效,并将其作为404错误进行管理,即如果模板不存在(加载模板时服务器返回404错误),则改为加载template/404.html 我该怎么做 编辑:当前答案建议使用响应错误拦截器。在这种情况下?我如何知道响应是对加载此模板的响应?您可以创建一个拦截器,以监视使用$http服务发出的所有请求,并截获任何

在AngularJS指令中,
templateUrl
参数是按逻辑定义的

'templates/' + content_id + '.html'
我不想建立规则来检查
content\u id
值是否有效,并将其作为404错误进行管理,即如果模板不存在(加载模板时服务器返回404错误),则改为加载
template/404.html

我该怎么做


编辑:当前答案建议使用响应错误拦截器。在这种情况下?我如何知道响应是对加载此模板的响应?

您可以创建一个
拦截器
,以监视使用
$http
服务发出的所有请求,并截获任何响应错误。如果您收到任何请求的状态404,只需将用户重定向到错误页面(
template/404.html

您需要在config函数中将拦截器推送到
$httpProvider

myApp.config( function ($httpProvider, $interpolateProvider, $routeProvider) {
    $httpProvider.interceptors.push('httpRequestInterceptor');
});
这是我的建议


干杯

您需要编写响应错误拦截器。大概是这样的:

app.factory('template404Interceptor', function($injector) {
    return {
        responseError: function(response) {
            if (response.status === 404 && /\.html$/.test(response.config.url)) {
                response.config.url = '404.html';
                return $injector.get('$http')(response.config);
            }
            return $q.reject(response);
        }
    };
});

app.config(function($httpProvider) {
    $httpProvider.interceptors.push('template404Interceptor');
});

演示:

我怀疑这在服务器端处理会更好。也许吧,但我想知道怎么做。为什么要在@NLN的答案半小时后添加相同的答案?@NexusDuck当我添加我的答案时,NLN的答案看起来不像现在,它解决的问题与OP提出的完全不同。但现在它是一样的权利,基本上是因为它是根据我的答案和我的演示更新的:)只要检查修订历史。我确实建议事先使用
拦截器。我认为
$location
服务实际上会将用户重定向到404模板,而实际上它没有。我后来用一个有效的演示更新了答案(并删除了答案中的$location部分)。谢谢你指出。就像在另一个回答中一样:这将拦截xhr中的任何404错误,不是吗?所以,如果我创建或使用其他指令,如果模板不存在,它将调用
templates/404.html
。这将拦截xhr中的任何404错误,不是吗?因此,如果我创建或使用其他指令,如果该模板不存在,它将调用
templates/404.html
@francadaval:是,这将截获所有xhr请求中的所有响应状态
app.factory('template404Interceptor', function($injector) {
    return {
        responseError: function(response) {
            if (response.status === 404 && /\.html$/.test(response.config.url)) {
                response.config.url = '404.html';
                return $injector.get('$http')(response.config);
            }
            return $q.reject(response);
        }
    };
});

app.config(function($httpProvider) {
    $httpProvider.interceptors.push('template404Interceptor');
});