【发布时间】:2009-02-24 09:12:44
【问题描述】:
我遇到了一个尴尬的问题。我有一个网页,上面有很多按钮,需要在不同的地方禁用和启用。现在,如果这是一个 Swing(或任何其他桌面 UI 界面),那将非常简单:我只需为我感兴趣的模型更改添加侦听器并相应地更新 UI。
这真的是基本的 MVC 东西。
问题是,对于如何在 Javascript 中很好地处理这个问题,我有点茫然。我正在走一条路线,最终会得到一些真正的意大利面条代码,其中按钮的点击侦听器正在更新 UI 控件,但结果不会很好。
编辑:让我给你一个更具体的例子。
示例
想象一个列出未结订单的屏幕。这些订单显示在表格中,因为每一行(订单)都有多个属性,例如当前管理订单的人员、下订单的人员、订单的用途、下订单的时间和订单的状态。
我已经完成了,因此您可以通过单击行来选择这些订单中的一个(或多个)。这会添加一个“selected”类,它会更改样式,很像列表。
关于行为,如果用户选择一个订单,则某些操作变为可用,例如打开订单(查看详细信息)、获得所有权、取消等。订单的属性也可能影响可用的操作,例如,如果订单已经为其他人“拥有”,则某些操作将被禁用。
如果您选择了多个订单,则其中一些选项(例如打开订单)不可用。
此外,通过后台 Ajax 调用,列表会定期刷新新订单。用户还可以单击刷新或过滤订单(按名称、日期范围等),然后重新加载订单。在重新加载订单时,某些按钮会被禁用。
我打算做第二个例子,但我认为这个例子足够复杂,足以说明问题的类型。现在我通过提供各种控件类开始了这一点。例如,当一个项目被选中时,具有“select”类的元素可能会被禁用/启用/设置样式。
现在这在简单的情况下工作得相当好,但我遇到了控件状态取决于多个条件的问题。此外,这些类也因某些元素想要设置样式、某些控件想要被禁用/启用以及在某些情况下两者都需要发生的事情而分崩离析。
在 Swing 中,我倾向于通过一种 updateUI() 方法来处理这类事情,只要相关控件或模型的状态发生更改,就会调用该方法。然后它将显式设置所有控件的状态。现在这可以说不是最有效的方法(例如,如果您有 30 个控件并且只需要更新其中一个,这有点浪费),但我发现这种简单性是值得的。另一种选择是控件/模型最终获得了太多关于它们所依赖的控件或依赖于它们的控件的信息。从耦合的角度来看,它变得很混乱。
但我在 Javascript 中没有这种(明显的)机制。 jQuery 提倡的不显眼的 Javascript 非常棒,因为它可以阻止随机代码 sn-ps 在您的代码中乱扔垃圾。但我需要更进一步,有一些方法来管理它的复杂性(因为它是一个相当复杂的屏幕,只会变得更复杂)。
【问题讨论】:
标签: javascript jquery model-view-controller