首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用has-scrolling region在app-header-layout内的iron-list上设置scroll-target

如何使用has-scrolling region在app-header-layout内的iron-list上设置scroll-target
EN

Stack Overflow用户
提问于 2016-05-31 19:36:32
回答 3查看 3K关注 0票数 5

我正在尝试在带有has-scrolling-regionapp-header-layout中使用iron-list (和iron-scroll-threshold)。

我使用聚合物CLI生成了基本的应用程序布局。

如果我在app-header-layout上不使用has-scrolling-region,而在iron-list上使用scroll-target"document",它就能正常工作。但是使用这种解决方案,滚动条属于窗口,而不是滑动到标题下面,我显然无法获得通常与这些布局相关的良好的“瀑布”行为。

因此,我在app-header-layout上使用has-scrolling-region,但是将相应的搜索器传递给iron-listscroll-target属性的正确方法是什么呢

代码语言:javascript
复制
  <!-- Main content -->
  <app-header-layout has-scrolling-region id="layout">
    <app-header condenses reveals effects="waterfall">
      <app-toolbar>
        <paper-icon-button icon="menu" drawer-toggle></paper-icon-button>
        <div title>Twiamo</div>
      </app-toolbar>
    </app-header>

    <iron-pages role="main" selected="[[page]]" attr-for-selected="name" id="page">
      <my-iron-list name="view1" scroll-target="[[_getScrollTarget()]]"></my-iron-list>
      <my-view2 name="view2"></my-view2>
      <my-view3 name="view3"></my-view3>
    </iron-pages>
  </app-header-layout>

我研究了app-header-layout的实现,以找到正确的元素。这个表达式实际上给出了正确的元素,一切都很正常。

代码语言:javascript
复制
_getScrollTarget: function() {
    return this.$.layout.shadowRoot.querySelector("#contentContainer");        
}

但是必须有一个更好的,正确的方法?抓取app-header-layout的影子DOM并不完全是在使用“公共接口”!

为了完成这个示例,这里是我的my-iron-list代码。My-iron-list包装和铁列表、iron-scroll-theshold和一些虚拟数据提供程序的东西。my-iron-list上的scroll-target仅传递给my-iron-list中的iron-listiron-scroll-threshold

代码语言:javascript
复制
<dom-module id="my-iron-list">
  <template>
    <iron-list items="[]" as=item id="list" scroll-target="[[scrollTarget]]">
      <template>
        <div class="item">[[item]]</div>
      </template>
    </iron-list>

    <iron-scroll-threshold
        id="scrollTheshold"
        lower-threshold="100"
        on-lower-threshold="_loadMoreData"
        scroll-target="[[scrollTarget]]">      
    </iron-scroll-threshold>    
  </template>

  <script>
    Polymer({

      is: 'my-iron-list',

      properties: {
        page: {
            type : Number,
            value : 0
        },
        perPage: {
            type : Number,
            value : 100
        },
        scrollTarget: HTMLElement,
      },

      _pushPage: function() {
          for (i = 0; i < this.perPage; i++) {
            this.$.list.push('items', 'Entry number ' + (i+1+this.page*this.perPage));   
          }
      },

      _loadMoreData: function() {
          this._pushPage();
          this.page = this.page + 1;
          this.$.scrollTheshold.clearTriggers();
      }
    });
  </script>
</dom-module>
EN

回答 3

Stack Overflow用户

发布于 2016-06-08 01:02:27

我和你有同样的问题,现在最干净的办法就是使用app-header scrollTarget。

在您的示例中,将id添加到app-header

代码语言:javascript
复制
 <app-header condenses reveals effects="waterfall" id="header">
      <app-toolbar>
        <paper-icon-button icon="menu" drawer-toggle></paper-icon-button>
        <div title>Twiamo</div>
      </app-toolbar>
 </app-header>

然后不再是

代码语言:javascript
复制
_getScrollTarget: function() {
    return this.$.layout.shadowRoot.querySelector("#contentContainer");        
}

只需使用scrollTarget属性

代码语言:javascript
复制
_getScrollTarget: function() {
    return this.$.header.scrollTarget;     
}

如果你发现了更好的方法,请告诉我。

干杯,

票数 4
EN

Stack Overflow用户

发布于 2017-02-10 03:46:41

我也为同样的问题而苦苦挣扎。虽然我使用的是iron-scroll-target-behavior而不是iron-scroll-threshold,但我仍然需要将滚动目标引用传递给app-layout-header中的元素。

如果has-scrolling-region为真,app-header-layout会将滚动目标设置为一个ID为#contentContainer的内部div。您可以将此div作为目标,并将其作为滚动目标传递给您的iron-list。

您只需要修改原始代码中的_getScrollTarget函数。

代码语言:javascript
复制
_getScrollTarget: function() {
    return this.$.layout.$.contentContainer;     
}

希望它能帮上忙!

票数 4
EN

Stack Overflow用户

发布于 2017-08-10 01:13:24

如果有人在2017年来这里寻找答案,我只想让你知道,同样的问题在聚合物2.0中仍然存在。

我能够克服这个问题,通过在我的应用程序外壳中有以下代码(例如。PSK的my-app.html):

首先,在app-header-layout元素上添加一个id属性'layout‘。

接下来,将其添加到您的Polymer类(在您的my-app.html等效类中):

代码语言:javascript
复制
static get properties() {
  return {
    scrollTarget: HTMLElement,
  }
}

ready() {
  super.ready();
  this.scrollTarget = this.$.layout.shadowRoot.querySelector("#contentContainer");
}

然后,将该属性传递给延迟加载页面上的scroll-target属性:

代码语言:javascript
复制
<my-page scroll-target="[[scrollTarget]]"></my-page>

最后,在你的惰性加载页面中(例如,我的页面):

代码语言:javascript
复制
<iron-list scroll-target="[[scrollTarget]]"></iron-list>

...

static get properties() {
  return {
    scrollTarget: HTMLElement,
  }
}

这不是一个理想的解决方案,但它是有效的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37544660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档