【问题标题】:Ionic 2 ionScroll event to not refresh viewIonic 2 ionScroll 事件不刷新视图
【发布时间】:2018-01-23 23:54:30
【问题描述】:

我在<ion-content> 中添加了一个触发foo() 方法的ionScroll 事件,并在<button ion-button> 中添加了一个触发foo() 的点击事件。在我的模板中,我添加了一个示例 {{ x }}foo() 方法递增 x

按钮单击刷新视图,以便显示新值。滚动没有。如果我添加 console.log 这将打印。

如果我将 fokus 设置为某个元素,例如文本框或其他元素,则视图会刷新并且 x 的新值会出现。

有人知道为什么吗?

【问题讨论】:

    标签: angular typescript ionic2 ionic3


    【解决方案1】:

    那是因为一个非常有趣和强大的东西叫做 Zones。如果这个概念对您来说是新概念,请参阅 herehere 以获得很好的解释。

    如您所见,

    应用程序状态变化是由三件事引起的:

    1) 事件 - 用户事件,例如点击、更改、输入、提交……

    2) XMLHttpRequests - 例如从远程服务获取数据时 计时器 -

    3) setTimeout(),setInterval(),因为 JavaScript

    ... 事实证明,只有这些是 Angular 实际上是 有兴趣更新视图。

    这就是为什么当你滚动时视图没有被更新,但是当你触摸页面的任何元素时它会更新(因为它是一个用户事件)。

    为了解决这个问题,其中一个选项是让 Angular 知道它需要了解您即将进行的一些更改,因为可能需要更新。您可以通过在区域内运行一些代码(更新x 属性的代码)来做到这一点,如下所示:

    import { Component, NgZone } from '@angular/core';
    
    @Component({...})
    export class MyPage {
    
        constructor(..., private ngZone: NgZone) {}
    
        public yourMethod(): void {
            this.ngZone.run(() => {
                // Update the x property here, and the view will be updated!
            });
        }
    }
    

    【讨论】:

    • 感谢您的回答,这些区域对我很有帮助。如果我理解正确的区域,它只是功能列表的一个胶囊。 zone 确保函数在离开 zone 之前全部调用?但是为什么不使用 promise 并将函数与 then 堆叠起来呢? promise.then(..).then(..)。而且我认为滚动是一个事件......
    • 关键是 zone 不仅用于确保某些方法将要执行的顺序,zone 是一个包装器,允许 angular 说 ok,做所有的事情你需要在幕后做,当我需要检查更改和更新视图时让我知道。这是一个非常强大的概念,因为它还可以用于提高应用程序的性能,通过在区域之外执行操作(从而使它们对 Angular 不可见),您可以阅读 here
    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2018-03-21
    • 2019-05-04
    • 1970-01-01
    • 2016-07-10
    • 2013-08-24
    相关资源
    最近更新 更多