在 Polymer 2.x 中使用 <iron-selector>

Using <iron-selector> in Polymer 2.x

我正在尝试演示 <iron-selector>。在演示中,我想在用户从列表中选择一个新值时登录到控制台。我做错了什么?

Here is the JSBin.

http://jsbin.com/ciceguqore/1/edit?html,console,output
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>

  <base href="//polygit.org/polymer+:master/components/">
  <script src="webcomponentsjs/webcomponents-lite.js"></script>
  <link rel="import" href="polymer/polymer-element.html">
  <link rel="import" href="iron-selector/iron-selector.html">

</head>
<body>
  <dom-module id="my-el">
    <template>
      <iron-selector selected="[[route]]">
        <div>Item 1</div>
        <div>Item 2</div>
        <div>Item 3</div>
      </iron-selector>
    </template>
    <script>
      class MyEl extends Polymer.Element {
        static get is() { return 'my-el' }

        static get properties() { return {
          route: {
            type: Number,
            notify: true,
            observer: '_routeChanged',
          },
        }}

        constructor() {
          super();
        }

        _routeChanged(route) {
          console.log('route', route);
        }

      }

      customElements.define(MyEl.is, MyEl);
    </script>
  </dom-module>

  <my-el></my-el>
</body>
</html>

要更改 route 的值,您必须使用双向绑定。由于 iron-selector 无法更改 route 的值,因此未触发观察者。

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>

  <base href="//polygit.org/polymer+:master/components/">
  <script src="webcomponentsjs/webcomponents-lite.js"></script>
  <link rel="import" href="polymer/polymer-element.html">
  <link rel="import" href="iron-selector/iron-selector.html">

</head>

<body>
  <dom-module id="my-el">
    <template>
    <style>
    .iron-selected{color:blue}
    </style>
    <p>Route value using two way binding in iron-selector: [[route]] </p>
      <iron-selector selected="{{route}}">
        <div>Item 1</div>
        <div>Item 2</div>
        <div>Item 3</div>
      </iron-selector>
      
      <p>Route value using one way binding in iron-selector: [[route]]</p>
      <iron-selector selected="[[route]]">
        <div>Item 1</div>
        <div>Item 2</div>
        <div>Item 3</div>
      </iron-selector>
      [iron-selector is working but it cannot update the value of route]
    </template>
    <script>
      class MyEl extends Polymer.Element {
        static get is() {
          return 'my-el'
        }

        static get properties() {
          return {
            route: {
              type: Number,
              notify: true,
              observer: '_routeChanged',
            },
          }
        }

        constructor() {
          super();
        }

        _routeChanged(route) {
          console.log('route', route);
        }

      }

      customElements.define(MyEl.is, MyEl);
    </script>
  </dom-module>

  <my-el></my-el>
</body>

</html>

您还可以使用 iron-selector 事件的 selected-changed,当所选的 属性 发生变化时,该事件会被触发。 示例:

<iron-selector on-selected-changed="_onSelectedChanged" selected="[[route]]">
 <div>Item 1</div>
 <div>Item 2</div>
 <div>Item 3</div>
</iron-selector>

_onSelectedChanged(e){
  console.log('route',e.detail.value);
}