在对aurelia组件使用无容器功能时,我看到了奇怪的行为。我们正在SVG容器中创建自定义元素,这要求我们使用无容器标签剥离自定义元素标签,然后再将其添加到DOM,因为SVG容器中仅允许SVGElements标签。
我们正在使用Aurelia版本1.0.0,并使用webpack构建SPA。
在这里,您可以找到一个gistrun示例,其中显示了无容器用法的两种实现。
https://gist.run/?id=58ba6282ad54c1263eec3a141fe42183
在此示例中,我创建了2个视图模型并将其绑定到我们的自定义元素。使用as-element="compose"
告诉aurelia我已经创建了viewmodel,而Aurelia不应该创建VM。这些与自定义元素之间的区别是无容器标签:
CustomElement在Viewmodel中没有@containerless
标记,但在HTML视图中具有“ containerless”。
withattr组件在HTML视图中没有“ containerless”,但在Viewmodel中确实具有@containerless
标记,如Aurelia HUB中所述。
我期望在两种情况下都可以看到一个蓝色矩形。由于无容器标签,Aurelia剥离了customelement标签。但是@containerless
标记似乎不起作用,如实现2所示。
题:
为什么这些实现有不同的输出?
哪个是正确的?我希望2,如Aurelia文档中所述,@containerless
标记应放在视图模型上。
任何帮助,将不胜感激 :)
最佳答案
@containerless
装饰器直接在放置它的元素上工作。
发生的事情是将装饰器应用于您的withattr
元素,但是as-element="compose"
将其转换为引擎盖下的compose
元素。然后,此compose
元素没有应用@containerless
标记。
同样,对于您的customelement
,您实际上不是将@containerless
应用于customelement
,而是应用于将其转换为的compose
。
删除as-element="compose"
部分,只需在标记中声明您的<withattr/>
元素为裸色,并且containerless
将起作用,因为实际元素仍为withattr
。
请注意,不建议将@containerless
与as-element
一起使用,除非没有其他方法可以完成某件事,就像在table
元素内使用自定义元素的情况一样。
为什么不简单在自定义元素中添加compose
并通过自定义元素上的可绑定属性将路径绑定到视图?
编辑
抱歉,我有点忽略了您想指定自己的ViewModel实例的事实。
此要求将您限制为使用compose
元素,因为这是Aurelia支持提供自己的ViewModel实例的唯一方法。
还可以确定您需要@containerless
。并且您需要将该@containerless
放在compose
元素上。
结束语,从技术角度来看,您的第一个解决方案似乎完美无缺。
根据个人喜好,我会这样做:<compose containerless view.bind="'./customelement.html'" view-model.bind="customElementViewModel"/>
代替这个:<customelement containerless as-element="compose" view-model.bind="customElementViewModel"/>
为了更加灵活地使用动态视图,请更清楚地说明我们正在使用compose
,而不必使用<require>
视图。但这实际上归结为偏好和其他要求。
关于javascript - 在VM上使用'@containerless'和在自定义元素的HTML View 中使用'containerless'时的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39706019/