2016-09-29 57 views
10

我有多個網格顯示基於給定過濾器的數據(在使用REST API的Web應用程序中)。顯示的數據結構始終相同(以簡化問題),但取決於用戶所在的屏幕,顯示的結果不同。如何禁用網格中的元素

另外,這是問題,必須禁用某些結果以便用戶不能選擇它們。

示例:Foo有N個小節。如果我想向父親(foo)添加一個新的孩子(小節),我會轉到搜索屏幕,但是我想將過濾後的網格顯示爲已經與父親相關的殘疾兒童。

目前我做細節控制服務器(數據庫querys)在這個問題上根據情況和「禁用」的結果,我不想加入。但是這種方法導致我無法重用查詢(由於具體連接,也許我需要搜索酒吧int順序與其他父親巴茲關聯,並且我想禁用已經與當前父親有關的酒吧......)

另一個辦法可以是以下幾點:

  • 保存在內存中(JavaScript的)
  • 與父親在數組中的「預渲染」電網事件(或類似)檢查每個元素是否與孩子(僅IDS)它是否包含在前面的數組中(通過id搜索)。如果是這樣,請將其標記爲禁用(例如)。 這是客戶端的可重用解決方案,我總是可以在服務器端重複使用相同的查詢。

在開始實施此解決方案之前,我想知道是否有更好的選擇。 我相信這是一個反覆出現的問題,我不想重新發明輪子。

任何策略或建議?

編輯:秀例如:

假設這種模式:

Category N:M Item 
SalesPromotion N:M Item 

我有兩個不同的畫面:一個顯示項目屬於一類,另一個顯示項目屬於一個銷售推廣。在每個屏幕中,我可以搜索項目並將其添加到類別或SalesPromotion。但是,當我搜索項目時,我希望已屬於Category/SalesPromotion的項目顯示爲已禁用(爲簡化起見,本示例中未顯示)。 我可以在服務器做到這一點,在做查詢這樣的:

-- Query for search Items in Category screen 
SELECT * FROM ITEMS i 
LEFT JOIN ItemsCategories ic on ic.ItemId = i.ItemId 
WHERE ic.CategoryId IS NULL OR ic.CategoryId <> @CurrentCategoryId 

-- Query for search Items in SalesPromotion screen 
SELECT * FROM ITEMS i 
LEFT JOIN ItemsSalesPromotions isp on isp.ItemId= i.ItemId 
WHERE isp.PromotionId IS NULL OR isp.PromotionId <> @CurrentPromotionId 

你可以想像,如果我有更多的場景像這些發生的事情(更復雜的模型和過程的查詢)。

一種選擇可能是:

已屬於在內存中當前的分類/ SalesPromotion(JavaScript中,客戶方)
  • 存儲項目。
  • 在客戶端的網格預渲染事件(或同等事件)中確定必須禁用哪些項目(通過搜索存儲項目中的每一行)。

所以,我的問題是wheter這種做法是一個很好的解決方案或者是有這個問題(我是這麼認爲的)一個衆所周知的解決方案。

+0

如果您將數據發送到客戶端並動態禁用它,您無法讓客戶端忘記該數據。服務器端授權必須告訴您可以看到哪些數據。客戶端也可能會看到所有行。 – ntohl

+1

你能提供更多關於你實際想要達到的信息嗎?我認爲你正在接近這個錯誤。 無論如何,您只需發送過濾器選項並在服務器端再次查詢,而不必禁用客戶端中的項目。 – Mightee

+0

@Mightee目前我是這樣做的:發送過濾器選項並在服務器中查詢。但是這樣我有多個不同的查詢。我想有一個查詢並在不同的場景中重複使用它。這就是爲什麼我想在客戶端禁用物品的原因。我將編輯我的問題以示例 –

回答

6

我改變了我的答案基於運算的評論

所以你基本上有兩種選擇這裏。

  1. 查詢數據庫後刪除Id服務器端。 (影響響應性能但更安全)。
  2. 用js在客戶端做它,並將它們從網格中移除。
+0

我不喜歡這樣,因爲「ID列表」可能很大 –

+0

選項2是我正在承擔的方法,如果我沒有找到更好的解決方案 –

3

在您的SELECT s中,LEFT JOIN部分是無用的。您的WHERE子句只使用ITEMS表,因此它對返回的行集沒有影響,並且由於另一個表沒有對應的行,所以這個其他表的列都是NULL

可以因此有一個SELECT * FROM ITEMS i(+過濾器),並據此調整了CategoryIdPromotionId你的UI等欄目是NULL

+0

你是對的,我簡化了樣本...我將edti它。 –