【问题标题】:Polymer custom component that controls iron-pages控制铁页的聚合物自定义组件
【发布时间】:2016-04-18 04:21:41
【问题描述】:

我正在尝试创建一个自定义 Polymer 组件,该组件具有控制 iron-page(分页和页面指示器)的按钮。

目前,我已经创建了以下组件:

<dom-module id="my-carousel">
  <template>
    <style>
      :host {
        display: block;
      }
      iron-pages,
      .pagination {
        border: 1px solid black;
        padding: 1em;
        margin: 1em;
      }
    </style>
    <iron-pages selected="0">
      <div>Page 0</div>
      <div>Page 1</div>
      <div>Page 2</div>
      <div>Page 3</div>
    </iron-pages>
    <div class="pagination">
      <a href="#" onclick="this.parentNode.parentNode.querySelector('iron-pages').selectPrevious(); return false;">Previous</a>
      <template is="dom-repeat" items="{{ironPages.items}}">
        &nbsp; <a href="#" onclick="this.parentNode.parentNode.querySelector('iron-pages').select({{index}}); return false;">{{index}}</a> &nbsp;
      </template>
      <a href="#" onclick="this.parentNode.parentNode.querySelector('iron-pages').selectNext(); return false;">Next</a>
      <br />
      Page {{ironPages.selected}} of {{ironPages.items.length}}
    </div>
  </template>
  <script>
    Polymer({
      is: "my-carousel",
      ready: function() {
        this.ironPages = this.$$('iron-pages');
      }
    });
  </script>
</dom-module>

现场演示:http://jsbin.com/rasuqaduhe/edit?html,output

似乎唯一有效的是:

  • 上一个/下一个链接
  • 总页数指标

我的问题如下

  1. onclick 属性看起来很难看。有没有合适的方法来做到这一点?
  2. 有没有更好的方法来获取iron-page的实例,或者this.$$('iron-pages')可以吗?
  3. 为什么当前所选页面的编号不起作用?
  4. 为什么点击页码不起作用?

【问题讨论】:

    标签: javascript html polymer custom-component web-component


    【解决方案1】:

    这里:http://jsbin.com/sesope/edit?html,output

    1. onclick 属性看起来很难看。有没有合适的方法来做到这一点?

      带注释的事件侦听器。 https://www.polymer-project.org/1.0/docs/devguide/events.html#annotated-listeners

    2. 有没有更好的方法来获取 Iron-page 的实例,或者 this.$$('iron-pages') 可以吗?

      没关系,但您也可以将id 添加到您的iron-pages 元素。 Polymer 在其本地 DOM 中自动构建静态创建的实例节点的映射,以方便访问常用节点,而无需手动查询它们。在元素模板中使用id 指定的任何节点都存储在idthis.$ 散列中。 https://www.polymer-project.org/1.0/docs/devguide/local-dom.html#node-finding

    3. 为什么当前所选页面的编号不起作用?

      iron-pages 元素未收到其selected 属性已更改的通知。但是,您应该在元素上声明 selected 属性,而不是依赖它。因此,当my-carouselselected 属性发生变化时,&lt;iron-pages selected="{{selected}}" id="pages"&gt; 这一行将通知iron-pages 元素更改页面。

    4. 为什么单击页码不起作用?

      onclick 之后添加$ 符号实际上会使其工作(onclick$="Your code")。但请不要那样做。请改用带注释的事件侦听器。

    请参考我的 jsbin 答案,以便您了解 Polymer 领域的工作原理。

    【讨论】:

    • 非常感谢,非常完美。关于iron-pages 上的id="pages" 只是一个小问题。该组件仍然可以工作,但会有两个具有相同id 的 DOM 元素。有什么办法吗?我是否只使用原始问题中的 CSS 选择器?还是有更好的方法?
    • 您可以为id 使用其他名称。我只是用它作为例子。
    • 我想你误解了我的意思。问题是当两个my-carousel 组件放置在同一页面上时。那么无论我选择什么值,他们的iron-pages 都将具有相同的id
    • @alesc Shadow DOM(以及某种程度上的 Shady DOM)封装了这些东西。这意味着您的 ID 和样式不会超出其各自元素的范围,因为它们仅在该元素的范围内。您可以将 Shadow DOM 视为超级精简的 iframe。
    • @alesc 这是一个jsbin,展示了 Shadow DOM 的可封装性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2015-08-28
    相关资源
    最近更新 更多