Mic*_*ski 19 dart shadow-dom angular-dart
我想基于从AJAX调用接收的一些信息动态构建组件树.
如何以编程方式从其他组件内部向DOM添加组件?我有<outer-comp>
,我想,基于一些逻辑,插入一个<inner-comp>
.以下代码只是将元素插入<inner-comp></inner-comp>
DOM,而不是实际<inner-comp>
表示.
@NgComponent(
selector: 'outer-comp',
templateUrl: 'view/outer_component.html',
cssUrl: 'view/outer_component.css',
publishAs: 'outer'
)
class AppComponent extends NgShadowRootAware {
void onShadowRoot(ShadowRoot shadowRoot) {
DivElement inner = shadowRoot.querySelector("#inner");
inner.appendHtml("<inner-comp></inner-comp>");
}
}
Run Code Online (Sandbox Code Playgroud)
更新: 我设法以下列方式正确渲染内部组件,但我仍然不确定这是否正确:
class AppComponent extends NgShadowRootAware {
Compiler compiler;
Injector injector;
AppComponent(this.compiler, this.injector);
void onShadowRoot(ShadowRoot shadowRoot) {
DivElement inner = shadowRoot.querySelector("#inner");
inner.appendHtml("<inner-comp></inner-comp>");
BlockFactory template = compiler(inner.nodes);
var block = template(injector);
inner.replaceWith(block.elements[0]);
}
Run Code Online (Sandbox Code Playgroud)
}
AngularDart 0.9.9中的API已更改:
AngularDart 0.10.0引入了以下更改:
所以pavelgj的代码现在看起来像这样:
class AppComponent extends ShadowRootAware {
Compiler compiler;
Injector injector;
Scope scope;
DirectiveMap directives;
AppComponent(this.compiler, this.injector, this.scope, this.directives);
void onShadowRoot(ShadowRoot shadowRoot) {
DivElement inner = shadowRoot.querySelector("#inner");
inner.appendHtml("<inner-comp></inner-comp>");
ViewFactory template = compiler([inner], directives);
Scope childScope = scope.createChild(scope.context);
Injector childInjector =
injector.createChild([new Module()..bind(Scope, toValue: childScope)]);
template(childInjector, [inner]);
}
}
Run Code Online (Sandbox Code Playgroud)
这将是块API的正确使用.
class AppComponent extends NgShadowRootAware {
Compiler compiler;
Injector injector;
Scope scope;
DirectiveMap directives;
AppComponent(this.compiler, this.injector, this.scope, this.directives);
void onShadowRoot(ShadowRoot shadowRoot) {
DivElement inner = shadowRoot.querySelector("#inner");
inner.appendHtml("<inner-comp></inner-comp>");
BlockFactory template = compiler([inner], directives);
Scope childScope = scope.$new();
Injector childInjector =
injector.createChild(new Module()..value(Scope, childScope));
template(childInjector, [inner]);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您需要重新编译内部模板,请确保执行childScope.$destroy()
上一个模板childScope
.
归档时间: |
|
查看次数: |
4354 次 |
最近记录: |