我有以下服务,可用于在AngularJS应用程序中提取状态模板:

.factory('templateService', ['$templateRequest', '$translate', function($templateRequest, $translate) {
    return {
        getTemplate: function(stateParams, url) {
            return $templateRequest( 'partials/' + url + '-' + ( $translate.use() ? $translate.use() : $translate.preferredLanguage ) + '.html');
        }
    }
}]);


它正在使用中:

.state('section3',
{
    parent: 'maincontent',
    url: '/section3',
    views: {
        'header@maincontent': {
            templateUrl: 'partials/section3/_header.html'
        },
        'content@maincontent': {
            templateProvider: function($stateParams, templateService) {
                return templateService.getTemplate($stateParams, '/section3/_content');
            }
        }
    }
})


从服务中可以看到,我从$ translate模块传递了一些额外的信息来加载特定于语言的模板,但是,如果该模板不存在,那只是一个错误。

我想做的是,如果模板不存在,则捕获错误,然后加载回退。

类似于以下内容:

var request = $templateRequest( 'partials/' + url + '-' + ( $translate.use() ? $translate.use() : $translate.preferredLanguage ) + '.html');
if(request)
    return request;
else
    return $templateRequest( 'partials/' + url + '-fallback.html');


如何检查$ templateRequest是否成功?由于上述代码无法立即使用。



我发现由于$ templateRequest是一个Promise,我可以使用以下命令捕获错误:

.factory('templateService', ['$templateRequest', '$translate', '$compile', function($templateRequest, $translate, $compile) {
    return {
        getTemplate: function(stateParams, url) {
            $templateRequest('partials' + url + '-' + ( $translate.use() ? $translate.use() : $translate.preferredLanguage ) + '.html')
            .then(function(response){
                return $compile(response);
            })
            .catch(function(){
                return $templateRequest('partials' + url + '-en.html');
            });
        }
    }
}]);


但是,即使使用$ compile,也意味着返回的模板没有用于thencatch。所以现在这些模板根本就没有用过...

最佳答案

我认为您错过了templateService.getTemplate的回报。

.factory('templateService', ['$templateRequest', '$translate', '$compile', function($templateRequest, $translate, $compile) {
    return {
        getTemplate: function(stateParams, url) {
            return $templateRequest('partials' + url + '-' + ( $translate.use() ? $translate.use() : $translate.preferredLanguage ) + '.html')
            .then(function(response){
                return $compile(response);
            })
            .catch(function(){
                return $templateRequest('partials' + url + '-en.html');
            });
        }
    }
}]);

关于javascript - AngularJS中的templateRequest后备,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35157587/

10-11 12:15