2017-02-26 82 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