fix(compiler): clone templates before compiling them

This is needed as the compiler changes templates during compilation
and we are caching templates in the `TemplateLoader`.

Closes #1058
This commit is contained in:
Tobias Bosch 2015-04-30 15:27:28 -07:00
parent f75a50c1dd
commit 9e8d31d532
2 changed files with 7 additions and 3 deletions

View File

@ -39,7 +39,9 @@ export class TemplateLoader {
StringMapWrapper.set(this._htmlCache, url, promise);
}
return promise;
// We need to clone the result as others might change it
// (e.g. the compiler).
return promise.then( (tplElement) => DOM.clone(tplElement) );
}
throw new BaseException('View should have either the url or template property set');

View File

@ -45,17 +45,19 @@ export function main() {
xhr.flush();
}));
it('should cache template loaded through XHR', inject([AsyncTestCompleter], (async) => {
it('should cache template loaded through XHR but clone it as the compiler might change it', inject([AsyncTestCompleter], (async) => {
var firstEl;
// we have only one xhr.expect, so there can only be one xhr call!
xhr.expect('base/foo', 'xhr template');
var template = new ViewDefinition({absUrl: 'base/foo'});
loader.load(template)
.then((el) => {
expect(DOM.content(el)).toHaveText('xhr template');
firstEl = el;
return loader.load(template);
})
.then((el) =>{
expect(el).toBe(firstEl);
expect(el).not.toBe(firstEl);
expect(DOM.content(el)).toHaveText('xhr template');
async.done();
});