【问题标题】:Polymer app-header-layout forced updatePolymer app-header-layout 强制更新
【发布时间】:2017-07-18 13:59:40
【问题描述】:

我有一个 Polymer 应用程序布局设置,其中 app-header-layoutapp-drawer-layout 内。我在app-header-layoutcontentContainer 内的各个页面之间来回切换。对于不同的页面,我有不同的app-toolbarsapp-layout 的工作方式是,如果你有一个大工具栏,你只需像这样将 2 个工具栏放在一起:

    <app-toolbar>
       <div class="title" main-title><h1>Main Title</h1></div>
    </app-toolbar>
    <app-toolbar>
       <div class="title" main-title><p class="subtitle">Subtitle</p></div>
    </app-toolbar>

所以有些页面有 1 个工具栏,而另一些页面有 2 个工具栏。问题是当您返回之前访问过的页面时,app-header-layout 的 contentContainer 不会自动将 padding-top 值调整为正确的工具栏高度。因此,如果这是一个带有 2 个工具栏的页面,则页面的内容会显示在第二个工具栏的下方。

所以问题是:如何强制 app-header-layout 在重新加载页面时重新计算其值?

这可能很容易,但我就是找不到。谢谢!

这是一个例子。不完全一样,但我认为它说明了同样的问题。

<link rel="import" href="../../bower_components/polymer/polymer.html">

<link rel="import" href="../../bower_components/app-layout/app-drawer-layout/app-drawer-layout.html">
<link rel="import" href="../../bower_components/app-layout/app-scroll-effects/app-scroll-effects.html">
<link rel="import" href="../../bower_components/app-layout/app-drawer/app-drawer.html">
<link rel="import" href="../../bower_components/app-layout/app-toolbar/app-toolbar.html">
<link rel="import" href="../../bower_components/app-layout/app-header/app-header.html">
<link rel="import" href="../../bower_components/app-layout/app-header-layout/app-header-layout.html">

<dom-module id="page-selector">
<template>
<style is="custom-style">
#toolbar1 {
  background-color:red;
}
#toolbar2 {
  background-color:green;
}
</style>
<app-drawer-layout fullbleed responsive-width="840px">

    <app-drawer slot="drawer">
        <div id="drawerbox"> 
                <h1>Menu</h1>
                <ol><li>Item 1</li>
                <li>Item 2</li></ol>
          </div>
        </div>
    </app-drawer>

    <div class="container">
      <app-header-layout>
        <app-header id="header" condenses reveals effects="waterfall" slot="header">
                <app-toolbar id="toolbar1">
                  <div main-title id="toolbartitlebox">Title Toolbar 1</div>
                  <div on-tap="_toggleToolbar">Toggle Toolbar</div>
                </app-toolbar>
                <template is="dom-if" if="{{Toolbar2}}">
                    <app-toolbar id="toolbar2">
                          <div class="title" main-title>Title toolbar 2</div>
                    </app-toolbar>
                </template>
        </app-header>

            <template is="dom-if" if="{{Toolbar1}}">
                <h1>This is Page 1</h1>
                <p>Some text for page 1</p>
            </template>

            <template is="dom-if" if="{{Toolbar2}}">
                <h1>This is text for Page 2</h1>
                <p>Some text for page 2</p>
            </template>

      </app-header-layout>
    </div>
    </app-drawer-layout>
</template>
<script>
    Polymer({
      is: 'page-selector',
  properties: {
        Toolbar1: {
          type: Boolean,
          value: true
        },
        Toolbar2: {
          type: Boolean,
          value: false
        }
    },
    _toggleToolbar: function() {
      this.Toolbar2 = !this.Toolbar2;
      if (this.Toolbar2) {this.Toolbar1 = false} else {this.Toolbar1 = true};
    }
    });
</script>
</dom-module>

【问题讨论】:

    标签: javascript polymer


    【解决方案1】:

    app-header-layout 有一个resetLayout() 方法,该方法会根据app-header-layout 设置自动重新计算padding-topmargin-top

    在每个页面加载时,您都可以这样做:

    this.shadowRoot.querySelector('app-header-layout').resetLayout();
    

    【讨论】:

    • 非常感谢!我在一个多月前发布了这个,同时我找到了另一个解决方案,但这可能会好很多,所以我会在接下来的几周内有空的时候尝试一下,然后回复你。
    • 没问题。我昨天才看到这个,但你说得对,Polymer 社区似乎没有多大帮助......无论如何,我希望这对你有用。
    • 我很好奇,所以我想马上尝试一下,效果很好!谢谢!我实际上有 this.$.header.resetLayout() 在那里(header 是 app-header 的 id,而不是 app-header-layout)但这当然是错误的,所以谢谢你在这里指出我的错误!我知道 Slack 是 Polymer 的好去处,但我发现在那里找到任何东西都很难。
    • 其实你也可以给你的app-header-layout一个ID,然后按照你的方式调用这个方法。两种方式都是正确的,只有带有ID的方式更具体。如果您有多个app-header-layout,那么您实际上应该使用 ID 来专门定位您想要的那个。