【发布时间】:2013-07-01 12:10:49
【问题描述】:
我有多个嵌套的 Web 组件来表示一个网格。我需要在飞镖代码中编写这些。 我有一个按照 dart 文档的建议创建 Web 组件的功能:
void addWebComponent(WebComponent component,String tagName,WebComponent parent) {
component.host = (new Element.html("<${tagName}></${tagName}>"));
var lifecycleCaller = new ComponentItem(component)
..create();
parent.append(component.host);
lifecycleCaller.insert();
return;
}
每个 web 组件都包含一个这样的模板:
<template>
<div class="grid">
<div class="large-12 columns" >
<content></content>
</div>
</div>
</template>
我的假设是调用 parent.append(component.host); 会将注入的 Web 组件 html 添加到 CONTENT 元素中。它没有。 这就是我所期待的结果:
<x-grid>
<div class="grid">
<div class="large-12 columns">
<x-row>
<div class="row">...</div>
</x-row>
</div>
</div>
</x-grid>
这是我得到的:
<x-grid>
<div class="grid">
<div class="large-12 columns">
**[Content should be here!]**
</div>
</div>
**[ CONTENT ENDS UP HERE]**
<x-row>
<div class="row">...</div>
</x-row>
</x-grid>
我的猜测是,您无法通过 parent.append(component.host) 从 dart 代码中添加到 Web 组件的内容中。是否需要其他一些功能或步骤才能完成这项工作? 这太痛苦了。
【问题讨论】:
-
什么被作为“String tagName”传递?另外,在调用 addComponent 函数之前,'parent' 是否已经插入到 DOM 中?
-
从 main 调用时,tagName 为“x-grid”,从 gridComponent 调用时为 x-row,从 RowComponent 调用时为 x-column。
-
在调用 addComponent 之前,我必须进行更多测试以查看是否将父级插入到 DOM 中。我的印象是lifecycleCaller.insert() 将组件添加到Dom。如果是这种情况,那么在将组件添加到父级之前,不会将父级添加到 dom 中。文档在动态创建 Web 组件方面很薄弱。
-
您的“主机”应该是您的元素扩展的 HtmlElement(即 DivElement)。您的“组件”应该是您为其创建的 WebComponent 子类(即:new XRow();)。我尝试了类似的测试用例,但无法重现您的结果,我的元素按您的预期嵌套。但我有一个比我确信您的代码小得多的示例,并且可能存在一些显着差异。
-
我将主机更改为普通的 Div,但我得到了相同的结果。没有任何嵌套组件插入到内容区域中。这也是在 html 中嵌套组件的情况:
该死的 x-row 作为父组件的最后一个子组件而不是被插入到模板的区域中。
标签: dart dart-webui