2014-07-24 59 views
0

我成功地使用綁定到一個數據表中的restJsonData源以顯示項目如何從<XE:restJsonData>訪問原始JSON數據源

<xe:restJsonData var='rest' endpoint="myendpoint" serviceUrl="/projects/" paramCount="limit" paramFirst="offset" paramFirstType="page1" splitPath="items"> </xe:restJsonData>

列表以使用戶能夠過濾器我想也有一個組合框從相同的響應數據驅動。 這聽起來開始很容易,但通過這樣的重複控制建立一個組合框不能正常工作。(出來空)

<xp:comboBox id="comboBox1"> <xp:repeat id="repeat1" rows="30" value="#{rest}" var="project" disableOutputTag="true"> <xp:selectItem itemLabel="#{project.fields[0].values[0].value}" itemValue="#{project.fields[0].values[0].value}"></xp:selectItem> </xp:repeat> </xp:comboBox>

所以我相信我需要手動遍歷JSON和建立的集合一個SelectItems。相當簡單,但首先我需要原始的json。我能得到它這樣的..

@Endpoint("myendpoint").xhrGet("/projects/").getData();

但我認爲我打電話web服務的兩倍。

所以我想要做的就是從數據源中獲取原始json以避免第二次調用,以便我可以手動迭代它。那可能嗎? myDs.getData()或類似的東西。

注意:我知道較長的期限,最好是用一些豆做這個,但是我想看看它是否可以用開箱即用的控件快速完成。

謝謝!

+1

您可以使用XPage的URL來查看原始JSON,並在末尾添加var,yourPage.xsp \ rest這就是您要求的內容嗎? –

+0

謝謝。我試圖得到一個原始json作爲一個字符串在Javascript中的句柄,所以我可以手動循環它。例如如果我有.. 我想能夠做類似var jsonStr = myDS.getData(); –

+0

我只使用了我提到的方式來驗證JSON是否正確加載並檢查內容。嘗試下面的Serdar的方法。 –

回答

0

restJsonData將接收到的數據緩存在您定義的範圍內。因此,在您指定的範圍內(請求/查看/會話/應用程序),您使用數據源的次數並不是問題。

詳細來說,restJsonData有一個JsonAccessor實際上讀取數據。只要我們不改變參數(例如頁面索引等),該類(從DataBlockAccessor繼承)預取數據並多次使用它。

數據保存在一個數據容器內,像bean一樣存儲在作用域變量中。但我真的不知道如何從數據容器中提取數據。

因此,使用額外的重複構建組合框是一個更好的主意。你的代碼看起來不錯,如果你發佈json數據結構,我們可以看看它爲什麼不起作用。

附加說明:Endpoint.xhrGet()未被緩存。

+0

乾杯。當你說「restJsonData沒有保存數據」時,這是否意味着如果你有一個restJsonData數據源並將兩個東西綁定到它(2個視圖或1個視圖和1個重複等)是否意味着該服務被觸發兩次?如果是這樣,你知道是否有任何種類的緩存?如果服務被稱爲「每次使用」,並沒有任何緩存,那麼我想我會直接去豆的方法:) –

+0

好吧,這是一個非常有趣的問題,我會說兩次。然而,只是測試過,實際上,它觸發一次!:)據我所知,FacesContext緩存數據。我會再檢查一次...... –

+0

的確,我早說過。 DataBlockAccessor可以發揮魔力,它可以在作用域之間緩存數據(可以爲數據源定義一個作用域)。因此,使用超出此範圍的數據的次數並沒有多大區別。我會更新我的答案! –