2017-02-26 88 views
1

我在<ion-content>中添加了一个ionScroll事件,该事件触发方法foo()<button ion-button>触发foo()的点击事件。在我的模板中,我添加了一个示例{{ x }}并且foo()方法增加了xIonic 2 ionScroll event to not refresh view

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

如果我将fokus设置为像文本框之类的某个元素,视图将刷新并显示新值x

有人知道为什么吗?

回答

3

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

正如你可以看到那里,

应用程序状态的变化是由三个因素引起:

1)活动 - 用户的事件,如点击,改变,输入,提交,...

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

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

......事实证明,这是唯一的情况下,当角实际上是 有意更新视图。

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

为了解决这个问题,其中一个选择是让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! 
     }); 
    } 
} 
+1

感谢您的回答,区域真的帮助了我。如果我理解正确的区域,它只是一个功能列表的胶囊。区域确保在离开区域之前所有被调用的函数?但是为什么不使用承诺并将函数与堆叠呢? 'promise.then(..)。然后(..)'。我认为scrollin是一个事件... – R3Tech

+0

关键是区域不仅用于确保某些方法将要执行的顺序,区域是允许角度说_ok的包装,做所有事情你需要在幕后进行,并让我知道何时需要检查更改并更新view_。这是一个非常强大的概念,因为它也可以用来改善应用程序的性能,通过在区域外面做事情(并且因此使它们对Angular不可见),正如你可以阅读[这里](https:// blog。虽然tram.io/angular/2017/02/21/using-zones-in-angular-for-better-performance.html) – sebaferreras

+1

阅读和学习 - 谢谢你。真的很酷的概念 – R3Tech