如何禁用网格中的元素
Posted
技术标签:
【中文标题】如何禁用网格中的元素【英文标题】:How to disable elements in a grid 【发布时间】:2017-02-07 19:34:04 【问题描述】:我有多个基于给定过滤器显示数据的网格(在使用 REST Api 的 Web 应用程序中)。显示的数据结构总是相同的(为了简化问题),但是根据用户所在的屏幕,显示的结果会有所不同。
此外,这就是问题所在,必须禁用某些结果,这样用户才能选择它们。
示例:一个 Foo 有 N 个小节。如果我想向父亲 (foo) 添加一个新的孩子 (bar),我会转到搜索屏幕,但我希望过滤后的网格显示为已与父亲相关的残疾孩子。
目前,我通过根据场景和“禁用”我不想要的结果执行 specifics joins 来控制服务器(数据库查询)上的这个问题。但是这种方法导致我无法重用查询(由于特定的连接。也许我需要搜索 Bars 以将它们与其他父亲 Baz 相关联,并且我想禁用已经与当前父亲相关的 Bars...)
另一种方法可能如下:
将与父亲相关的孩子(仅 ID)保存在内存中的数组中 (javascript) 在“prerender”网格事件(或类似事件)中,检查每个元素是否包含在前一个数组中(按 id 搜索)。如果是这样,请将其标记为禁用(例如)。 这是客户端的可重用解决方案,我总是可以在服务器端重用相同的查询。在开始实施此解决方案之前,我想知道是否有更好的选择。 我确定这是一个反复出现的问题,我不想重新发明***。
有什么策略或建议吗?
编辑:显示示例:
假设这个模型:
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
你可以想象,如果我有越来越多这样的场景(当然还有更复杂的模型和查询)会发生什么。
另一种选择可能是:
将已经属于当前 Category/SalesPromotion 的项目存储在内存中(javascript、客户端)。 在客户端的网格预渲染事件(或等效事件)上确定必须禁用哪些项目(通过搜索存储项目中的每一行)。所以,我的问题是这种方法是一个好的解决方案,还是有一个众所周知的解决方案来解决这个问题(我认为是这样)。
【问题讨论】:
如果您将数据发送到客户端并动态禁用它,您无法让客户端忘记该数据。服务器端授权必须告诉你可以看到哪些数据。客户端也可能会破解以查看所有行。 你能提供更多关于你实际想要达到的目标的信息吗?我认为你正在接近这个错误。无论如何,您可以在服务器端发送过滤器选项并再次查询,而无需在客户端禁用项目。 @Mightee 目前我正在这样做:发送过滤器选项并在服务器中查询。但是这样我有多个不同的查询。我想有一个查询并在不同的场景中重用它。这就是为什么我想在客户端禁用项目。我将编辑我的问题以显示示例 【参考方案1】:我根据 op 的评论更改了答案
所以你在这里基本上有两个选择。
-
查询 db 后删除 Ids 服务器端。 (影响响应性能但更安全)。
在客户端使用 js 执行此操作并将它们从网格中删除。
【讨论】:
我不喜欢这个,因为“id 列表”可能很大 如果我没有找到更好的解决方案,我正在考虑的方法 2 【参考方案2】:在您的SELECT
s 中,LEFT JOIN
部分是无用的。你的WHERE
子句只用到了ITEMS
表,所以它对返回的行集没有影响,而且由于另一个表没有对应的行,所以这个另一个表的列都是NULL
。
因此,您可以拥有一个 SELECT * FROM ITEMS i
(+ 过滤器)并根据 CategoryId
、PromotionId
等列调整您的 UI。NULL
。
【讨论】:
你说得对,我把示例过于简化了......我会编辑它。以上是关于如何禁用网格中的元素的主要内容,如果未能解决你的问题,请参考以下文章