自定义compileService用于缓存链接函数

时间:2014-09-15 15:16:52

标签: javascript angularjs caching hash typescript

我正在使用AngularJSTypeScript,并且我正在尝试创建自己的编译服务,该服务将具有缓存机制。

现在我的服务很简单: 它输入一个html字符串,创建一个哈希键,检查它是否存在于缓存中。 如果存在,则返回缓存的链接函数,否则创建链接函数,缓存并返回。

它看起来像这样:

// found this on the internet..
private createHashKey(html: string): number {
    var hash = 0, i, chr, len;
    if (html.length == 0) return hash;
    for (i = 0, len = html.length; i < len; i++) {
        chr = html.charCodeAt(i);
        hash = ((hash << 5) - hash) + chr;
        hash |= 0; // Convert to 32bit integer
    }

    return hash;
}

public compile(html: string): ng.ITemplateLinkingFunction {
    var key = this.createHashKey(html);

    if (!this.compiledCache.containsKey(key)) {
        this.compiledCache.setValue(key, this.$compile(html));
    }

    return this.compiledCache.getValue(key);
}

现在我用$compile(html)替换了所有compileService.compile(html)次来电,直到我接到一个没有传递字符串作为输入参数的电话,但{{1}对象。

我查看了JQuery文件,发现了这个:

angular.d.ts

CRAP !!!!!

所以现在我需要支持三个interface ICompileService { (element: string, transclude?: ITranscludeFunction, maxPriority?: number): ITemplateLinkingFunction; (element: Element, transclude?: ITranscludeFunction, maxPriority?: number): ITemplateLinkingFunction; (element: JQuery, transclude?: ITranscludeFunction, maxPriority?: number): ITemplateLinkingFunction; } 重载。 现在,由于从compile对象创建哈希键与JQuery不同,因此我可以提供&#34;虚拟重载&#34;像这样:

string

所以我有两个问题:

  1. 有没有办法让public compile(element: JQuery); public compile(element: Element); public compile(element: string); public compile(html: any): ng.ITemplateLinkingFunction { var key = this.createHashKey(html); // this will not work with JQuery objects if (!this.compiledCache.containsKey(key)) { this.compiledCache.setValue(key, this.$compile(html)); } return this.compiledCache.getValue(key); } 函数名称保留在多个实现上?我想答案是否定的,因为我理解compile是如何工作的,但也许这里有一个解决方法。我不想创建方法名称,如TypescriptcompileJQuery

  2. 我需要考虑一种优雅的方法来将compileHtmlJQuery个对象作为我的键,并使其非常高效。

  3. 任何额外的提示也会很棒。

1 个答案:

答案 0 :(得分:0)

而不是var key = this.createHashKey(html);你能做到:

var strVal = html;
if(html instanceof jQuery) strVal = html.html();

var key = this.createHashKey(strVal);