如何禁用网格中的元素

本文关键字:元素 网格 何禁用 | 更新日期: 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的评论改变了我的答案

这里有两个选项

  1. 查询db后删除id的服务器端。(影响响应性能,但更安全)。
  2. 在客户端用js完成,并从网格中删除它们。

在您的SELECT中,LEFT JOIN部分是无用的。您的WHERE子句只使用ITEMS表,因此它对返回的行集没有影响,并且由于另一个表没有相应的行,因此另一个表的列都是NULL

你可以有一个单一的SELECT * FROM ITEMS i(+过滤器),并根据CategoryId, PromotionId等列是NULL来调整你的UI。