blob: f0e35e0782a527e8396b098f0e4e15a2d056add7 [file] [log] [blame]
part of angular.directive;
/**
* Fetches, compiles and includes an external Angular template/HTML.
*
* A new child [Scope] is created for the included DOM subtree.
*
* [NgIncludeDirective] provides only one small part of the power of
* [NgComponent].  Consider using directives and components instead as they
* provide this feature as well as much more.
*
* Note: The browser's Same Origin Policy (<http://v.gd/5LE5CA>) and
* Cross-Origin Resource Sharing (CORS) policy (<http://v.gd/nXoY8y>) restrict
* whether the template is successfully loaded.  For example,
* [NgIncludeDirective] won't work for cross-domain requests on all browsers and
* for `file://` access on some browsers.
*/
@NgDirective(
selector: '[ng-include]',
map: const {'ng-include': '@url'})
class NgIncludeDirective {
final dom.Element element;
final Scope scope;
final BlockCache blockCache;
final Injector injector;
final DirectiveMap directives;
Block _previousBlock;
Scope _previousScope;
NgIncludeDirective(this.element, this.scope, this.blockCache, this.injector, this.directives);
_cleanUp() {
if (_previousBlock == null) return;
_previousBlock.remove();
_previousScope.destroy();
element.innerHtml = '';
_previousBlock = null;
_previousScope = null;
}
_updateContent(createBlock) {
// create a new scope
_previousScope = scope.createChild(new PrototypeMap(scope.context));
_previousBlock = createBlock(injector.createChild([new Module()
..value(Scope, _previousScope)]));
_previousBlock.elements.forEach((elm) => element.append(elm));
}
set url(value) {
_cleanUp();
if (value != null && value != '') {
blockCache.fromUrl(value, directives).then(_updateContent);
}
}
}