远端节点的聚合物事件

Mic*_*ick 3 dart polymer dart-polymer

我正在努力熟悉聚合物,并一直在尝试用它构建一个示例应用程序.按照https://www.dartlang.org/docs/tutorials/polymer-intro上的教程并阅读其他StackOverflow问题,例如如何从Polymer Dart触发自定义事件?我设法构建了两个元素,其中一个元素触发第二个元素所作用的事件.但是,我只能弄清楚如何在触发元素的子元素的情况下执行此操作.例如,如下

foo.html

<link rel="import" href="bar.html">
<polymer-element name="foo">
    <template>
        <my-bar on-myevent="{{react}}"></mybar>
    </template>
    <script type="application/dart" src="foo.dart"></script>
</polymer-element>
Run Code Online (Sandbox Code Playgroud)

foo.dart

@CustomTag('my-foo')
class Foo extends PolymerElement {

  Foo() {}
  Foo.created() : super.created();

  void react() {
    print("Event happened and was heard!");
  }
}
Run Code Online (Sandbox Code Playgroud)

一个bar.html

<polymer-element name="bar">
    <template>
        <button on-click="{{click}}"></button>
    </template>
    <script type="application/dart" src="bar.dart"></script>
</polymer-element>
Run Code Online (Sandbox Code Playgroud)

bar.dart

@CustomTag('my-bar')
class Bar extends PolymerElement {

  Bar() {}
  Bar.created() : super.created();

  void click(Event e, var details, Node node) {
    print("Triggering event");
    fire('my-event');
  }
}
Run Code Online (Sandbox Code Playgroud)

的index.html

<!DOCTYPE html>
<html>
<head>
    <script type="application/dart" src="main.dart"></script>
    <script src="packages/browser/dart.js"></script>
    <link rel="import" href="foo.html">
</head>
<body>

<div id="content">
    <foo></foo>
</div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我想要做的是能够移动元素bar外部的按钮foo,就像我想要设计的应用程序一样,我希望输入控件存在是页面与主输出显示的单独区域(的foo元素).基本上,我希望能够制作foo.htmlindex.html看起来像这样:

foo.html

<polymer-element name="foo">
    <template>
        <!-- Databound output stuff here -->
    </template>
    <script type="application/dart" src="foo.dart"></script>
</polymer-element>
Run Code Online (Sandbox Code Playgroud)

的index.html

<!DOCTYPE html>
<html>
<head>
    <script type="application/dart" src="main.dart"></script>
    <script src="packages/browser/dart.js"></script>
    <link rel="import" href="foo.html">
    <link rel="import" href="bar.html">
</head>
<body>

<div id='control-panel'>
    <bar></bar>
</div>
<div id="content">
    <foo></foo>
</div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到任何关于如何将bar按钮移出foo元素的示例,以使事件bar可见foo.从bar不是孩子的时候听这个事件的最佳方式是foo什么?

Sco*_*les 5

聚合物是围绕着这个想法而设计的controllers.我的意思是,当A和B需要进行一些交互时,首选架构是创建第三个实体C.C可以管理A和B的生命周期,并协调通信.这种结构对于可维护性非常好,因为C的使用者与A和B的细节绝缘,并且A和B与所有部件绝缘.它还为A和B之间的阻抗匹配提供了便利点.

<polymer-element name="my-c">
 <template>
  <my-a on-my-event="{{coolAction}}"></my-a>
  ...
  <my-b id="b"></my-b>
 </template>
 <script>
   Polymer({
    coolAction: function() {
      this.$.b.doCoolThing();
    }
   });
 </script>
</polymer-element>
Run Code Online (Sandbox Code Playgroud)

对组件结构不熟悉的用户经常认为这种设置不方便,但我的经验是,一旦你习惯它,它会非常有用.

最终,您的视图是组件图,其中任何特定子图通常可以在最小压力下被剪切,替换或重新附加.这非常适合构建灵活的应用程序.

这个signals概念适用于您真正希望A和B直接相互交谈,切入组件图的罕见场合.良好的应用程序设计几乎不需要这种能力,应尽可能避免使用.