我正在使用AngularJS
和TypeScript
,并且我正在尝试创建自己的编译服务,该服务将具有缓存机制。
现在我的服务很简单: 它输入一个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
所以我有两个问题:
有没有办法让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
是如何工作的,但也许这里有一个解决方法。我不想创建方法名称,如Typescript
和compileJQuery
。
我需要考虑一种优雅的方法来将compileHtml
和JQuery
个对象作为我的键,并使其非常高效。
任何额外的提示也会很棒。
答案 0 :(得分:0)
而不是var key = this.createHashKey(html);
你能做到:
var strVal = html;
if(html instanceof jQuery) strVal = html.html();
var key = this.createHashKey(strVal);