如何禁用网格中的元素
How to disable elements in a grid
我有多个基于给定过滤器显示数据的网格(在使用 REST Api 的 Web 应用程序中)。显示的数据结构总是相同的(为了简化问题),但是根据用户所在的屏幕,显示的结果是不同的。
此外,这就是问题所在,必须禁用某些结果,这样用户就无法select它们。
示例:一个 Foo 有 N 个 Bars。如果我想向父亲 (foo) 添加一个新的 child (bar),我会转到搜索屏幕,但我希望过滤后的网格显示为已禁用 children,这已经与父亲.
目前,我正在通过执行 特定连接 来控制服务器(数据库查询)上的这个问题,具体取决于场景和我不想要的 "disabling" 结果。但是这种方法导致我无法重用查询(由于特定的连接。也许我需要搜索 Bars int 以便将它们与其他父亲 Baz 相关联,并且我想禁用已经与当前父亲相关的 Bars...)
另一种方法如下:
- 将与父亲相关的children(仅ids)保存在内存中的数组中(javascript)
- 在 "prerender" 网格事件(或类似事件)中检查每个元素是否包含在前一个数组中(按 ID 搜索)。如果是这样,将其标记为禁用(例如)。
这是 client-side 中的可重用解决方案,我始终可以在服务器端重用相同的查询。
在开始实施这个解决方案之前,我想知道是否有更好的选择。
我确定这是一个反复出现的问题,我不想重新发明轮子。
有什么策略或建议吗?
编辑:显示示例:
假设这个模型:
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
你可以想象如果我有越来越多这样的场景(当然还有更复杂的模型和查询)会发生什么。
另一种选择是:
- 将已经属于当前 Category/SalesPromotion 的项目存储在内存中(javascript,客户端)。
- 在客户端的网格预呈现事件(或等效事件)上确定必须禁用哪些项目(通过搜索存储项目中的每一行)。
所以,我的问题是这种方法是否是一个好的解决方案,或者是否有针对此问题的 well-known 解决方案(我认为是)。
在您的 SELECT
中,LEFT JOIN
部分没有用。您的 WHERE
子句仅使用 ITEMS
table,因此它对返回的行集没有影响,并且由于另一个 table 没有对应的行,因此列其他 table 都是 NULL
.
因此,您可以拥有一个 SELECT * FROM ITEMS i
(+ 过滤器)并根据 CategoryId
、PromotionId
等列调整您的 UI [=14] =].
我根据操作员的评论更改了我的答案
所以你在这里基本上有两个选择。
- 查询数据库后删除 IDs 服务器端。 (影响响应性能但更安全)。
- 在客户端使用 js 执行并将它们从网格中删除。
我有多个基于给定过滤器显示数据的网格(在使用 REST Api 的 Web 应用程序中)。显示的数据结构总是相同的(为了简化问题),但是根据用户所在的屏幕,显示的结果是不同的。
此外,这就是问题所在,必须禁用某些结果,这样用户就无法select它们。
示例:一个 Foo 有 N 个 Bars。如果我想向父亲 (foo) 添加一个新的 child (bar),我会转到搜索屏幕,但我希望过滤后的网格显示为已禁用 children,这已经与父亲.
目前,我正在通过执行 特定连接 来控制服务器(数据库查询)上的这个问题,具体取决于场景和我不想要的 "disabling" 结果。但是这种方法导致我无法重用查询(由于特定的连接。也许我需要搜索 Bars int 以便将它们与其他父亲 Baz 相关联,并且我想禁用已经与当前父亲相关的 Bars...)
另一种方法如下:
- 将与父亲相关的children(仅ids)保存在内存中的数组中(javascript)
- 在 "prerender" 网格事件(或类似事件)中检查每个元素是否包含在前一个数组中(按 ID 搜索)。如果是这样,将其标记为禁用(例如)。 这是 client-side 中的可重用解决方案,我始终可以在服务器端重用相同的查询。
在开始实施这个解决方案之前,我想知道是否有更好的选择。 我确定这是一个反复出现的问题,我不想重新发明轮子。
有什么策略或建议吗?
编辑:显示示例:
假设这个模型:
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
你可以想象如果我有越来越多这样的场景(当然还有更复杂的模型和查询)会发生什么。
另一种选择是:
- 将已经属于当前 Category/SalesPromotion 的项目存储在内存中(javascript,客户端)。
- 在客户端的网格预呈现事件(或等效事件)上确定必须禁用哪些项目(通过搜索存储项目中的每一行)。
所以,我的问题是这种方法是否是一个好的解决方案,或者是否有针对此问题的 well-known 解决方案(我认为是)。
在您的 SELECT
中,LEFT JOIN
部分没有用。您的 WHERE
子句仅使用 ITEMS
table,因此它对返回的行集没有影响,并且由于另一个 table 没有对应的行,因此列其他 table 都是 NULL
.
因此,您可以拥有一个 SELECT * FROM ITEMS i
(+ 过滤器)并根据 CategoryId
、PromotionId
等列调整您的 UI [=14] =].
我根据操作员的评论更改了我的答案
所以你在这里基本上有两个选择。
- 查询数据库后删除 IDs 服务器端。 (影响响应性能但更安全)。
- 在客户端使用 js 执行并将它们从网格中删除。