很难访问另一个元素的影子 DOM,这是设计使然。与其让您的两个自定义元素如此紧密耦合,更好的方法是使用事件或信号。您的控制面板元素应该使用从 PolymerElement 类继承的方便的fire() 方法接收用户输入并触发适当的事件。您的应用程序可以捕获这些事件,然后将这些事件转发到您的工作区元素。如果这看起来过于迂回,您可以使用 Polymer 的 <core-signals> element 来传递事件,而无需与中介打交道。
例如,在您的控制面板元素中,您可能有一个粗体按钮。
<button on-click="{{boldClicked}}">Bold</button>
单击该按钮时,将执行控制面板的boldClicked() 方法作为响应。它可能看起来像这样:
void boldClicked(Event event, var detail, Element target) {
fire('core-signal', detail: {'name': 'bold', 'data': null});
}
然后在你的工作区元素的 HTML 文件中,你可能有:
<core-signals on-core-signal-bold="{{boldEventReceived}}"></core-signals>
最后,在你的工作区元素的 Dart 类中会出现这样的方法:
void boldEventReceived(Event event, var detail, Element sender) {
// manipulate workspace shadow DOM here
}
这只是实现此目的的几种方法之一。您可以查看 Dart 团队的 <core-signals> example 了解更多信息。
当然,如果您充分发挥 Polymer 的潜力,您会发现您需要做的手动 DOM 操作非常少。使用数据绑定和数据驱动的视图是一种成功的策略。