【问题标题】:Nesting web components from dart code从 dart 代码中嵌套 Web 组件
【发布时间】: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


【解决方案1】:

试试这个:

添加到父级:

List<WebComponent> items = toObservable([]);

变化:

parent.append(component.host);

收件人:

parent.items.add(component);

然后修改HTML如下:

<template>
  <div class="grid">
     <div class="large-12 columns" template iterate="item in items">                    
        {{ new SafeHtml.unsafe(item.host.innerHtml) }}
     </div>
  </div>          
</template>

【讨论】:

  • 嗯。我收到一个错误:HTML 有 0 个顶级元素,但预期有 1 个。
  • 这很痛苦。出于某种原因,我的 M5 版本没有遇到任何调试器断点,这让我非常沮丧,哈哈。
  • 抛出该错误是因为SafeHTML.unsafe() 只需要一个顶级 HTML 元素。我不确定为什么它有 0,听起来 host 还没有正确初始化..
  • 嗯。当我关闭 useShadowDom 时它可以工作!问题,这会影响 Web 组件的工作方式吗?这有点令人困惑。我使用了 outerHtml 而不是 innerHtml,所以我的组件
    被注入到 DOM 中。
  • 另外,如果我按照你的方式做,我将失去在 html 中声明 webcomponents 的选项。
猜你喜欢
相关资源
最近更新 更多
热门标签