覆盖$ templateCache以区分大小写

时间:2016-06-28 14:35:04

标签: javascript angularjs angular-templatecache angularjs-decorator

在维护对原始提供程序的引用的同时,是否可以覆盖$templateCache等核心提供程序? 我想覆盖$templateCache不区分大小写。

即。

之类的东西
var normalGet = $templateCache.get;
var normalPut = $templateCache.put;
$templateCache.get = function(key) { normalGet(key.toLowerCase()); };
$templateCache.put = function(key,value) { normalPut(key.toLowerCase(), value); };

但是更少的hacky,更多DI风格?

2 个答案:

答案 0 :(得分:3)

我说使用decorator来修改实际的Provider代码,这些代码将在配置阶段完成,然后再付诸行动。

我们使用了$templateCacheProvider,因为附加前缀Provider表示其provider(当您修改指令DDO时,它可以是Directive)。您必须将此代码放在应用程序的config阶段内。

<强>代码

app.config(['$provide', Decorate]);
function Decorate($provide) {
  $provide.decorator('$templateCacheProvider', 
    ['$delegate', function($delegate) {
      var templateCache = $delegate[0];

      var normalGet = templateCache.get;
      var normalPut = templateCache.put;
      templateCache.get = function(key) { return normalGet(key.toLowerCase()); };
      templateCache.put = function(key,value) { normalPut(key.toLowerCase(), value); };

      return $delegate;
    }]);
}

答案 1 :(得分:0)

尝试下面的代码,对我来说效果很好。

angular.module('utils').config(['$provide', ($provide) => {
    $provide.decorator('$templateCache',
        ['$delegate', ($delegate: ITemplateCacheService) => {
            let templateCache = $delegate;
            let caseSenstiveGet = templateCache.get;
            let caseSenstivePut = templateCache.put;
            templateCache.get = (key) => { return caseSenstiveGet(key.toLowerCase()); };
            templateCache.put = (key, value) => { return caseSenstivePut(key.toLowerCase(), value); };
            return $delegate;
        }]);
}]);