扩展angular.js以自动将后缀附加到所有templateURL值

时间:2018-01-11 23:25:06

标签: javascript angularjs

我有很多angular.js组件,它们以典型的方式加载html模板:

templateUrl: 'www.me.com/view.html'

我想以某种方式调整/扩展angular.js,以便在访问之前将某些字符串附加到templateURL。例如,在上面的例子中,将被提取的实际uri将是:

www.me.com/view.html?a=b&c=d

不是

www.me.com/view.html

我知道我可以简单地编辑组件文件以追加它?a = b& c = d在最后,但我无法这样做。但是,我可以在网站上添加一个javascipt文件,以某种方式完成此操作。

任何想法?

1 个答案:

答案 0 :(得分:3)

根据您的要求,您可以使用HTTP拦截器。如果您的URL在添加查询参数之前唯一地标识模板,则可以使用。

HTTP拦截器允许您使用其他数据来装饰HTTP请求和响应。

这是一个可能看起来如何的例子:

function templateInterceptor() {
    return {
        request: function(config) {
            if (config.url.indexOf('www.me.com/view.html') === 0) {
                config.params = config.params || {};
                config.params.a = 'b';
                config.params.c = 'd';
            }

            return config;
        }
    }
}

angular.module('app', [])
    .factory('templateInterceptor', templateInterceptor)
    .config(function($httpProvider) {
        $httpProvider.interceptors.push('templateInterceptor');
    });

if (config.url.indexOf('www.me.com/view.html') === 0)取决于确定URL是否引用模板的一些可靠方法。 也许过滤.html文件的请求会更准确。

仅当您的URL在追加查询参数之前唯一标识每个模板的原因是由于AngularJS模板缓存而产生的原因。 AngularJS使用templateUrl来缓存模板请求。

如果此解决方案不起作用,您可能会被迫分叉AngularJS并在模板缓存代码中进行更改。