如何禁用网格中的元素
本文关键字:元素 网格 何禁用 | 更新日期: 2023-09-27 18:09:41
我有多个网格显示基于给定过滤器的数据(在使用REST Api的web应用程序中)。显示的数据结构总是相同的(为了简化问题),但根据用户所在的屏幕,显示的结果是不同的。
此外,这也是问题所在,一些结果必须被禁用,以便用户不能选择它们。
例子:一个Foo有N个bar。如果我想向父元素(foo)添加一个新的子元素(bar),我将进入搜索屏幕,但是我希望过滤后的网格显示为已经与父元素相关的残疾元素。
目前,我通过执行具体连接来控制服务器(数据库查询)上的这个问题,这取决于我不想要的场景和"禁用"结果。但是这种方法导致我不能重用查询(由于特定的连接)。也许我需要搜索栏以便将它们与其他父亲Baz关联,并且我想禁用已经与当前父亲相关的栏…)
另一种方法是:
- 将与父节点相关的子节点(仅id)保存在内存中的数组中(javascript)
- 在"preender"网格事件(或类似)中检查每个元素是否包含在前一个数组中(按id搜索)。如果是,将其标记为禁用(例如)。这是一个可重用的解决方案,在客户端,我总是可以重用相同的查询在服务器端。
在开始实施这个解决方案之前,我想知道是否有更好的选择。我确信这是一个反复出现的问题,我不想重新发明轮子。
有什么策略或建议吗?
编辑:show example:
假设这个模型:
Category N:M Item
SalesPromotion N:M Item
我有两个不同的屏幕:一个显示属于一个类别的物品,另一个显示属于一个促销活动的物品。在每个屏幕中,我可以搜索商品并将它们添加到Category或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
你可以想象如果我有越来越多这样的场景(当然有更复杂的模型和查询)会发生什么。
可以是:
- 在内存中存储已经属于当前类别/促销的项目(javascript,客户端)。
- 客户端中的网格预呈现事件(或同等事件)确定必须禁用哪些项(通过搜索存储项中的每一行)。
所以,我的问题是这种方法是否是一个好的解决方案,或者对于这个问题是否有一个众所周知的解决方案(我认为是的)。
我根据op的评论改变了我的答案
这里有两个选项
- 查询db后删除id的服务器端。(影响响应性能,但更安全)。
- 在客户端用js完成,并从网格中删除它们。
在您的SELECT
中,LEFT JOIN
部分是无用的。您的WHERE
子句只使用ITEMS
表,因此它对返回的行集没有影响,并且由于另一个表没有相应的行,因此另一个表的列都是NULL
。
你可以有一个单一的SELECT * FROM ITEMS i
(+过滤器),并根据CategoryId
, PromotionId
等列是NULL
来调整你的UI。