【问题标题】:GWT Editors for readonly and edit mode只读和编辑模式的 GWT 编辑器
【发布时间】:2012-06-25 16:57:21
【问题描述】:

GWT 的 Editor 框架非常方便,它不仅可以用于编辑 POJOs,还可以用于只读显示。

但我不完全确定进行内联编辑的最佳做法是什么。

假设我有一个PersonProxy 和一对Presenter-View 用于显示和编辑PersonProxy。这个 Presenter-View 应该默认以只读模式显示 PersonProxy,如果用户按下 edit 按钮,它应该允许用户编辑 PersonProxy 对象。

我想出的解决方案是创建两个编辑器(PersonEditEditorPersonDisplayEditor),它们都通过UiBinder 添加到ViewPersonEditEditor 包含 ValueBoxEditorDecorators 和 PersonDisplayEditor 包含正常的 Labels
最初我显示PersonDisplayEditor 并隐藏PersonEditEditor

View 中,我为每个编辑器创建两个RequestFactoryEditorDriver,并使其可以通过View 接口从Presenter 访问。我还在View 接口中定义了一个setState() 方法。

Presenter 第一次显示时,我调用PersonDisplayDriver.display()setState(DISPLAYING)

当用户点击 Edit 按钮时,我会从我的Presenter 调用PersonEditDriver.edit()setState(EDITING)
setState(EDITING) 将隐藏PersonDisplayEditor 并使@987654350 @可见。

我不确定这是否是最好的方法。如果不是,推荐的内联编辑方法是什么?在编辑器上进行单元测试的最佳方法是什么?

【问题讨论】:

  • 如果我没有理解错误的问题,那么您想要编辑/查看 PersonProxy 对象的功能。为什么要为一个对象创建两个 Presenter-View?如果假设 GUI 除了小部件可见性之外具有相同的编辑/视图外观,那么您可以通过 make 方法来实现,该方法将设置控件属性,如 control.setEnabled(false);仅供查看(显示中)。
  • 我有两个单独的编辑器用于编辑/查看。一种是使用标签和其他文本框。我想避免有两个 Presenter-View 对,因为代码大多是多余的或琐碎的(显示它的全部是关于在只读驱动程序上调用 display() 和编辑它调用 edit())。 Presenter-View par 更像是一个工作流的东西。
  • @Ümit 我采取完全相同的方法...

标签: gwt requestfactory gwt-editors


【解决方案1】:

如果你有能力开发 2 个不同的视图,那就去吧,它会给你最大的灵活性。

我们在我们的应用程序中所做的就是将这两个状态烘焙到我们的编辑器中,我们无法承担开发和维护两个视图的成本,例如可以是标签或文本框的自定义组件(在大多数情况下,我们只需将文本框设置为只读并应用一些样式来隐藏框边框)。
为了检测我们处于哪种模式,因为我们使用RequestFactoryEditorDriver(就像你一样),我们让我们的编辑器实现HasRequestContext:在这里接收null值意味着使用了驱动程序的display()方法,所以我们'重新处于只读模式。另一种方法是使用EditorVisitor 和一些HasReadOnly 接口(顺便说一句,RequestFactoryEditorDriver 所做的正是将RequestContext 传递给HasRequestContext 编辑器)。

【讨论】:

  • 如何处理混合了只读和可编辑字段的页面? IE。您如何对某些部分进行编辑(),对其他部分进行显示()?谢谢!
  • 我们有 2 名司机,edit() 一名,display() 另一名。显然,屏幕必须分成 2 个编辑器,每个编辑器由一个驱动程序控制。
  • 好的,谢谢。不确定这种方法是否适合我。我有多个编辑器,根据数据,一些子编辑器应该是只读的。在完成编辑/显示并检查 setValue() 中的数据之前,我不知道是哪个
  • 是否有可能拥有ListEditor 并允许用户按需编辑该列表中的任何项目?例如,通过即时将只读编辑器替换为可编辑的编辑器?
  • 我很幸运地将EditorVisitor 传递给驱动程序并检查ctx.getAbsolutePath() 是否与我要启用的字段匹配。然后ctx.getEditor() 返回该字段,我可以将其转换并调用setReadOnly(boolean)。不需要两个驱动程序或两个视图。
【解决方案2】:

是的,Presenter-View 对应该是。但是如果您愿意,这里有两种方法可以实现此功能:

1) 在一个ui.xml中集成编辑/查看代码设计,即在EDitHorizo​​natlPanel中编辑代码和在ViewHorizo​​ntalPanel中查看代码。面板有不同的id。通过使用 id,使用显示方法显示/隐藏面板。如果getView().setState() ==Displaying 则显示ViewHorizo​​ntalPanel,如果getView().setState()==Editing 则显示EditHorizo​​ntalPanel

2) 不使用标签,只使用文本框。在查看模式下需要时设置 Enable 属性为 false,否则为 true

您已经创建了两个 Presenter/view,但我认为如果 Edit/View 功能具有相似的代码,则无需为了查看目的一次又一次地重写相似的代码。

如果一个大项目有这么多的编辑/查看功能,并且您将创建这种类型的多个视图/演示者,那么您的项目大小就变得不必要了。

我认为无论我提出什么建议,这可能都不是好方法,但应该找出有助于避免代码复制的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2022-12-13
    相关资源
    最近更新 更多