我有一个实现RouterLayout的组件,如下所示:
@Tag("side-menu")
@HtmlImport(value = "src/components/side-menu.html")
public class SideMenu extends PolymerTemplate<TemplateModel> implements RouterLayout {
@Id("menu")
private PaperListBox listBox = new PaperListBox();
public SideMenu() {
listBox.addMenu(new PaperItem("tutorial", TutorialView.class));
listBox.addMenu(new PaperItem("icons", IconsView.class));
}
}我路由父布局的视图子节点。
@Route(value=IconsView.VIEW_ROUTE, layout = SideMenu.class)
public class IconsView extends Div {
public static final String VIEW_ROUTE = "icons";
public IconsView() {
add(new Label("ICONS VIEW"));
}
}但是结果覆盖了side-menu.html文件的所有内容。
side-menu.html模板库格式
<side-menu>
<div>App Name</div>
<div id="menu"></div>
<div id=contenido><!-- I want to show here my view Icons --></div>
</side-menu>但结果是
<side-menu>
<div>
<label>ICONOS VIEW</label>
</div>
</side-menu>预期结果是:
<side-menu>
<div>App Name</div>
<div id="menu"></div>
<div id=contenido>
<div>
<label>ICONOS VIEW</label>
</div>
</div>
</side-menu>发布于 2018-06-27 13:55:52
在vaadin文档中这样说:
您可以使用
Component或ElementAPI向模板中添加子组件,但是由于PolymerTemplate使用影子DOM ,所以阴影树被呈现,而不是轻量DOM中的元素子。 这意味着模板需要有一个<slot></slot>来标记轻型DOM元素应该呈现的位置。
我为这个复合布局找到了一个解决方案:
我只需要修改我的模板side-menu.html并添加如下<slot>标记:
<side-menu>
<div>App Name</div>
<div id="menu"></div>
<slot></slot>
</side-menu>然后,当我的视图被加载时,它被呈现到模板中的<slot>标记中。
发布于 2018-06-26 06:07:47
在您的例子中的问题是,由于没有功能的裸模板,以及绑定和自定义模板模型,服务器端不知道它的内容。因此,Div.add()将其视为空div,并覆盖其内容。
在您的示例中,一种方法是通过元素API修改内容,这可以是如下所示:
public IconsView() {
label = new Label("ICONS VIEW");
getElement().appendChild(label.getElement());
}见API规范
另一种方法是将html模板扩展为功能齐全的聚合物元素。
关于这一点还有更多的内容,例如:
https://vaadin.com/docs/v10/flow/polymer-templates/tutorial-template-list-bindings.html
https://stackoverflow.com/questions/51033900
复制相似问题