2016-12-07 77 views
1

我遵循教程,現在我試圖將這種學習擴展到一個真正的應用程序。在我的應用程序中,我使用了JSON模型。與教程不同,我的是一個真實世界的應用程序,當我加載數據模型時,我必須獲取用戶憑據以充當過濾器。在教程中,模型在component.js中加載。在我的應用程序中,我必須提示用戶輸入用戶名和密碼,以便在應用程序的第一個視圖中顯示一個登錄片段。這恰好是主視圖,嚴格來說,它在 component.js之後運行。驗證用戶之後,我通過Ajax從服務器收集JSON數據,並通過this.setData(my_json)將其置於默認模型中。爲什麼this.setModel()在上下文中的行爲不同

當測試從主視圖到詳細視圖的路由時,我產生了一個頑固的bug,因爲在詳細視圖中調用this.getModel()產生了一個空模型。嗯 - 我只是在主視圖中設置模型,並可以在表格控件中看到數據 - 給出了什麼?

我認爲是一個路由問題,但確認這不是問題 - 我可以控制檯登錄通過路由器的參數,無論如何細節視圖出現,所以路由是好的。

回顧:我在主頁面中使用this.setModel(),然後在詳細信息頁面中使用this.getModel(),但後者是一個空模型。

問題:我希望模型在應用程序中可用。這些教程着重於在component.js中設置模型,但我不能。例如,從主視圖或其他任何不是component.js的位置設置全局模型的正確語法是什麼。

我想我需要使用下面的主機(最後一行是顯著):

var oModel = new JSONModel(); // declare a JSON model 
oModel.setData(<json string>); // load a JSON string fetched from serve etc. 
sap.ui.getCore().setModel(oModel); // important - set as the core model 

我覺得我的問題的根源是,在教程似乎車型在組件設置經由

this.setModel(oModel); // a line in component.js 

因此,我認爲本上下文component.js是應用全局而在一個視圖涉及視圖沿,這是有意義的。我對嗎?

回答

3

在教程this.setModel(...)裏面的Component.js會直接在Component上設置模型。因此,模型在該組件內的所有視圖中都可見。

當您在控制器中看到this.getView().setModel(...)時,您知道該模型僅設置在該視圖上(因此對於其子項也是可見的)。

但是,如果您在控制器內看到類似this.setModel(...)的東西,您應該檢查this.setModel(...)內發生了什麼。模型可能被設置在視圖,組件或甚至其他地方!一些教程利用了所謂的「BaseController」概念。這基本上是其他控制器的父控制器,因此這種方法允許編寫一些便利的API,您可以輕鬆地在從此BaseController擴展的子控制器中重新使用這些API。例如,看看BaseController of the Worklist App。在那裏您可以看到setModel(...) API正在視圖上設置模型。這意味着無論何時在您的控制器中調用this.setModel(...)(從該BaseController擴展),您的模型都將設置在視圖中!

此外,因爲在Master-Detail應用程序中Master和Details頁面(父/子關係)之間沒有層次結構,所以Master視圖上的模型在Detail視圖中不可見。

在你的情況下,它似乎是最好直接在組件上設置模型。您可以通過致電

this.getOwnerComponent().setModel(...); 

在您的任何控制器內。或者直接在Component.js like in the Wordlist tutorial上執行。您可以稍後將數據傳播到該模型,即稍後從您的控制器中傳播數據。

+0

謝謝納比 - 非常清楚,我將書籤作爲可能需要在將來提及毫無疑問的東西。在我提出這個問題之前,我嘗試通過getOwnerComponent()。getModel()來獲取模型,並且我現在看到,如果我使用getOwnerComponent()將模型設置到組件中, .setModel()。這麼近,但迄今爲止。 –

相關問題