2016-03-17 14 views
4

我已經更新了我的項目和依賴關係。 每當我第一次渲染一個頁面時,(除了root)它都不能馬上工作。ionic2意見不更新,代碼確實執行

F/e我有一個根頁面,它是一個登錄表單。無論何時在localStorage中存在令牌,發射器都會將其提供給登錄頁面。然後注入NavController,推我的主頁,一個TabController。

這不會馬上發生,我可以摘下我的鼻子,去浴室它停留在根頁面上。當我真正關注我的輸入時,它只會推動新視圖。 (它也顯示了一些黑色,當它不能呈現頁面,當你做錯事情時離子崩潰

然後在標籤頁上,第一個標籤不會呈現,但是當我點擊第一個對於其他選項卡,它們需要單擊兩次(選項卡欄只在單擊兩次時才變爲活動狀態)。此後,它的所有工作都正常,但當然,不是我們想要的。 這是一個什麼視頻我看到了,如果你在0.0時暫停視頻,你會看到日誌狀態Token successfull。這就像在代碼中一樣,在推動之前,新頁面被啓動,視圖不會被更新,直到我點擊像輸入一樣的元素。

ngOnInit() { 
    this.sessionService.subscribe(token => { 
     if (token && token.length) { 
      console.log("token returned success!", token, this.navController); 
      setTimeout(() => { this.navController.push(<any>MainTabs); }, 250); 
     } else { 
      console.log("token returned", token); 
     } 
    }); 
} 

日誌中的錯誤是與瀏覽器中的離子相關的。如你所見,當Push被觸發時,看起來應該是這樣,第一頁不斷顯示一個加載器。這應該消失一旦內容被加載(它被加載我看到console.logs觸發器設置值)。如果我現在點擊第一個標籤項目2次,它會顯示內容。 我選擇點擊「Acties」按鈕,它顯示了第一個選項卡(注意我點擊了第三個)。點擊第四個呈現第三個頁面,在此之後,它們被渲染一次並按預期點擊工作。

Wierd?

+0

我沒有訪問視頻(拒絕訪問)。 ..'sessionService'做什麼? –

+0

Ah shucks視頻已過期。 sessionService的作用並不重要,但它存儲諸如令牌等東西在localStorage中。在啓動應用程序時,它會檢查存儲並將其發送給訂閱者。 (令牌)。所以他們可以處理它,並假設它在會話中。一旦它失效,它將清除令牌併發出此等。 –

+0

這讓我想到區域問題。你是否嘗試使用'NgZone'類在區域內執行訂閱的回調?請參閱https:// angular。io/docs/ts/latest/api/core/NgZone-class.html –

回答

7

你可以嘗試添加一個骯髒的修復與tick()

@App({ 
    template: ` 
    <ion-tabs (change)="_onTabChange()"> 
     <ion-tab tabIcon="heart" [root]="tab1"></ion-tab> 
     <ion-tab tabIcon="star" [root]="tab2"></ion-tab> 
    </ion-tabs>` 
}) 
class MyApp { 
    constructor(private _applicationRef : ApplicationRef) { 
    this.tab1 = Tab1; 
    this.tab2 = Tab2; 
    } 

    private _onTabChange() : void { 
    setTimeout(() => { 
     this._applicationRef.tick(); 
    }, 200); 
    } 
} 

顯然,沒有骯髒的伎倆是去除離子的polyfills

+0

這個改變似乎不是順便說一句,但調用tick是好的,我可以把它放在所有的構造函數或w/e中。 –

+0

剛剛發現它更糟糕,在任何API請求之後,它不會更新視圖,因此每次收到響應時都必須進行勾選。 F。是的 –

+1

@MathijsSegers這幾乎聽起來像'ionic.bundle.js'他們沒有添加'angular-polyfills.js' ... – PierreDuc

2

這不是永久的解決方案,我很確定; 然而正如@PiereDuc的評論所說,它可以通過強制執行application.tick

來解決,所以在你的主應用程序組件(它是一個組件嗎?)。您注入ApplicationRef,然後您可以執行類似操作。

setInterval(() => { app.tick(); }, 400); 

這是令人厭惡的,但它現在工作。當我知道發生了什麼時,我會更新它。

+0

工程很好。在'2.0.0-rc.2'中使用它。如果在使用'firebase.auth()。onAuthStateChanged'事件時沒有更新視圖問題。現在解決了這個問題。 – Guus

+0

試着找出是否有什麼不對,因爲你不需要這個。我的問題是雙/不必要的polyfills –

+0

我的演示應用程序只是由離子cli創建的裸標籤模板。我在控制檯中看到我的頁面變量已更改,但未反映在視圖中。當使用'this.events.publish'和'this.events.subscribe'時也有這個事件,我看到事件被觸發,一個變量集但視圖沒有更新。 – Guus