【问题标题】:Angular 4 - property value isn't being updated in the viewAngular 4 - 视图中未更新属性值
【发布时间】:2018-03-11 01:05:38
【问题描述】:

我有一个带有属性shouldNavBeTransparent: boolean = trueHomePage 页面,它指示页面的导航栏 是否应该有class="transparent

在窗口达到其高度的 90% 后,我将属性 shouldNavBeTransparent 设置为 true。

我的问题是视图中的属性没有被更改。在视图中,它始终为 false,而在组件中,它正在被更改。

这是我的home.ts 文件:

import {Component} from '@angular/core';
import {IonicPage} from 'ionic-angular';

@IonicPage({segment: "/"})
@Component({
  selector: 'page-home',
  templateUrl: 'home.html',
})
export class HomePage {

  services: Array<{ icon: string, title: string, subhead: string, content: string }>;

  shouldNavBeTransparent: boolean = true;

  scrollHandler($event) {
    this.shouldNavBeTransparent = ($event.scrollWidth * 0.9) < $event.scrollTop;
    console.log(this.shouldNavBeTransparent);
  }
}

scrollHandler 中的console.log 输出真假,表示它正在改变:

我在视图中检查属性的部分是(home.html):

<ion-header [class.transparent]="shouldNavBeTransparent">

我触发滚动事件的部分:

<ion-content (ionScroll)="scrollHandler($event)">

即使我写了{{ shouldNavBeTransparent }},我得到的都是真的。


我正在使用 Ionic v3.19.1

【问题讨论】:

  • 如何将scrollHandler设置为滚动事件处理程序?
  • @ConnorsFan 感谢您的回复。我已经编辑了这个问题。您现在可以看到我是如何设置滚动事件的。
  • 不应该是$event.scrollHeight * 0.9而不是$event.scrollWidth * 0.9吗?
  • 不,不应该。尽管如此,声明已经达成,所以没关系。
  • home.scss。它总是被应用(因为我无法解决这个问题),这意味着它存在并且有效

标签: angular typescript ionic-framework ionic2 ionic3


【解决方案1】:

在做了一些研究后,我发现你需要使用 ngZone

滚动事件发生在 Angular 的区域之外。这是出于性能原因。因此,如果您尝试将值绑定到任何滚动事件,则需要将其包装在 zone.run()

import { Component, NgZone } from '@angular/core';
 constructor( public zone: NgZone){}
scrollHandler($event) {
   this.zone.run(()=>{
     // the update needs to happen in zone
    this.shouldNavBeTransparent = ($event.scrollWidth * 0.9) < $event.scrollTop;
    console.log(this.shouldNavBeTransparent);
   })

【讨论】:

  • 这是我一直在寻找的答案。检测更改也将解决我的问题,但您的答案更准确。因此,我接受这个答案。谢谢!
【解决方案2】:

您可以使用ngClass 有条件地分配类:

<div [ngClass]="{'yourclass':yourcondition}">

针对您的具体问题:

<ion-header [ngClass]="{'transparent':shouldNavBeTransparent}">

编辑

import { ChangeDetectorRef } from '@angular/core';

constructor (private ref: ChangeDetectorRef) {}

scrollHandler($event) {
    this.shouldNavBeTransparent = ($event.scrollWidth * 0.9) < $event.scrollTop;
    this.ref.detectChanges();
}

this.ref.detectChanges(); 应该手动更新您的变量。

【讨论】:

  • &lt;ion-header [ngClass]="{'transparent':shouldNavBeTransparent}"&gt; 仍然没有运气。正如我所提到的,即使我这样做 {{ shouldNavBeTransparent }} 它总是正确的。
  • 它有效,但你没有解释为什么,这个答案也不是很清楚。不过还是谢谢你。
猜你喜欢
  • 1970-01-01
  • 2017-11-28
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多