【问题标题】:Scroll on top page when next is triggered触发下一个时在首页滚动
【发布时间】:2020-05-04 10:02:55
【问题描述】:

我有 Angular 8 应用程序。

我还有一些导航按钮:下一个和上一个。

但我希望当用户单击 next 时,下一页将从页面顶部开始。而不是它留在前一个状态的地方。所以我尝试了

nativeElement.scrollTo(0, 0);

但是我会得到一个错误。

这是导航链接:EcheqProcessComponent


 <app-echeq-page #scrollMe
      *ngIf="!submitting"
      [currentEcheqPage]="currentEcheqPage"
      [currentEcheqPager]="currentEcheqPager"
    ></app-echeq-page> 

 <app-echeq-progress-nav
      *ngIf="!submitting"
      [currentPage]="currentEcheqPageIdx + 1"
      [totalPages]="currentEcheqPath.length"
      (next)="next()"
      (previous)="prev()"

      [isbtnDisabled]="currentEcheqSubmission?.status === EcheqSubmissionStatus.EXPIRED"

      [conditionals]="{
        isFirst: currentEcheqPager.isFirst,
        sending: sending
      }"
    ></app-echeq-progress-nav>

当你必须在页面顶部导航时,我有这个页面:EcheqPageComponent


export class EcheqPageComponent implements OnInit, AfterViewInit {
  @ViewChild('scrollMe', { static: false }) private contentPageRef: ElementRef;
  @Input() currentEcheqPage: EcheqPage;
  @Input() currentEcheqPager: EcheqPager;
  // We use template variables to query the components
  @ViewChildren('echeqElement') elementComponents: QueryList<EcheqElementComponent>;

  EcheqElement = EcheqElement;
  elementsChanged = true;

  constructor(private echeqService: EcheqService) {}

  ngOnInit() {}

  ngAfterViewInit() {
    this.scrollOnTopPage();
  }


  private scrollOnTopPage(): void {
    this.contentPageRef.nativeElement.scrollTo(0, 0);
  }
}

然后我得到这个错误:

echeq-process.component.html:13 ERROR TypeError: Cannot read property 'nativeElement' of undefined
    at EcheqPageComponent.push../src/app/echeq/echeq-page/echeq-page.component.ts.EcheqPageComponent.scrollOnTopPage (echeq-page.component.ts:79)

那么我要改变什么?

谢谢

你的意思是这样的?

  <app-echeq-page #scrollMe
      [hidden]="submitting"
      [currentEcheqPage]="currentEcheqPage"
      [currentEcheqPager]="currentEcheqPager"
    ></app-echeq-page>

我现在是这样的:

 <app-echeq-page #scrollMe
     *ngIf="!submitting"
      [currentEcheqPage]="currentEcheqPage"
      [currentEcheqPager]="currentEcheqPager"
    ></app-echeq-page>

还有这个:

  ngAfterViewInit() {
    setTimeout(() => {
       this.scrollOnTopPage();
    }, 1000) ;
 }

但仍然出现此错误:

core.js:7376 ERROR TypeError: Cannot read property 'nativeElement' of undefined
    at EcheqPageComponent.push../src/app/echeq/echeq-page/echeq-page.component.ts.EcheqPageComponent.scrollOnTopPage (echeq-page.component.ts:81)
    at echeq-page.component.ts:29
    at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
    at Object.onInvokeTask (core.js:26760)
    at 

但这是一个很大的页面:EcheqPageComponent.html

<div class="echeq-page">
  <h4 class="echeq-title">{{ currentEcheqPage.title }}</h4>

  <div class="echeq-page-elementcontainer">
    <ng-container *ngFor="let element of currentEcheqPage.elements" [ngSwitch]="element.type">
      <app-html-display
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [currentEcheqPager]="currentEcheqPager"
        *ngSwitchCase="EcheqElement.HTML_DISPLAY"
      ></app-html-display>
      <app-youtube-player *ngSwitchCase="EcheqElement.VIDEO_DISPLAY" [url]="element.videoUrl"></app-youtube-player>
      <div class="echeq-element-media echeq-element-media-image" *ngSwitchCase="EcheqElement.IMAGE_DISPLAY">
        <img class="echeq-element-media-image" [src]="getValidImageUrl(element)" alt="Afbeelding" />
      </div>
      <app-bool-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.BOOL_QUESTION"
      ></app-bool-question>
      <app-int-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.INT_QUESTION"
      ></app-int-question>
      <app-str-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.STR_QUESTION"
      ></app-str-question>
      <app-date-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.DATE_QUESTION"
      ></app-date-question>
      <app-date-time-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.DATE_TIME_QUESTION"
      ></app-date-time-question>
      <app-time-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.TIME_QUESTION"
      ></app-time-question>
      <app-num-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.NUM_QUESTION"
      ></app-num-question>
      <app-str-list-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.STR_LIST_QUESTION"
      ></app-str-list-question>
      <app-str-enum-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.STR_ENUM_QUESTION"
      ></app-str-enum-question>
      <app-num-enum-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.NUM_ENUM_QUESTION"
      ></app-num-enum-question>
      <app-num-enum-set-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.NUM_ENUM_SET_QUESTION"
      ></app-num-enum-set-question>
      <app-str-enum-set-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.STR_ENUM_SET_QUESTION"
      ></app-str-enum-set-question>
      <app-bool-set-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchCase="EcheqElement.BOOL_SET_QUESTION"
      ></app-bool-set-question>
      <app-bool-question
        class="echeq-page-element"
        #echeqElement
        [answer]="getAnswerFor(element)"
        [echeqElement]="element"
        [isOnlyElementOnPage]="currentEcheqPage.elements.length==1"
        *ngSwitchDefault
      ></app-bool-question>
    </ng-container>
  </div>
</div>

【问题讨论】:

  • scrollMe 未定义,可能是因为*ngIf="!submitting"。您确定该元素实际上在您期望的页面上吗?也许在这里使用[hidden]="submitting" 会更合适。
  • 谢谢。我编辑帖子。但得到同样的错误

标签: javascript angular typescript react-native-elements


【解决方案1】:

还要检查组件中的提交:

export class EcheqPageComponent implements OnInit, AfterViewInit  {
  @ViewChild(EcheqPageComponent, { static: false, read: ElementRef }) private contentPageRef: ElementRef<EcheqPageComponent>;
  ...

  ngAfterViewInit() {
    this.scrollOnTopPage();
  }

  private scrollOnTopPage() {
    if(!this.submitting) {
      this.contentPageRef.nativeElement.scrollTo(0, 0)
    }
  }
}

并为 EcheqPageComponent 组件附加样式,因为您的滚动可能不起作用

【讨论】:

  • 谢谢。但是提交是在 EcheqProcessComponent
  • 然后还会出现此错误:“EcheqPageComponent”类型上不存在属性“scrollTo”.ts(2339)
  • 从 EcheqPageComponent 添加模板
  • 我们可以去聊天吗?
  • 能给个聊天链接吗
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
相关资源
最近更新 更多