Scout Eclipse 检查脏字段

Scout Eclipse check for dirty fields

当您尝试关闭 Swing 应用程序并更改字段中的相同值时,应用程序会询问您是否要保存更改。

我的第一个问题是为什么 RAP 应用程序不问同样的问题?

第二个也是更重要的问题是如何强制验证字段更改以及如何操作它。

例如:

我有 table,行和一些字段低于 table。如果我单击行,则会在字段中输入一些值。我可以更改此值并单击按钮保存。

我想强制对行单击进行更改验证。因此,如果应用了更改并且单击行,应用程序应警告我某些更改未保存。 但我应该能够操纵什么是变化,什么不是。例如,如果 table 在行上单击填充一些数据,如果字段这不会更改,但如果我输入的值是相同的字段,这就是更改。

我发现了方法

checkSaveNeeded();

但它什么也没做。 (如果我改变值或不)

我看到每个字段都有方法

@Override
public final void checkSaveNeeded() {
    if (isInitialized()) {
      try {
        propertySupport.setPropertyBool(PROP_SAVE_NEEDED, m_touched || execIsSaveNeeded());
      }
      catch (ProcessingException e) {
      SERVICES.getService(IExceptionHandlerService.class).handleException(e);
      }
    }
  }

所以我应该操纵更改抛出 m_touched?

Scout 如何处理这个问题?


添加

我正在寻找检查脏字段并弹出消息对话框的功能,与关闭表单时相同,以及设置字段是否脏的方法。

我看 here and here,但它只描述了如何为弹出消息存储值以及如何触发此消息(验证)。

My first question is why RAP application doesn't ask same question ?

我不确定你指的是哪个消息框,但应该是这样。


Eclipse Scout Forum中有几个关于未保存的更改表单生命周期的问题。我想你可以用 Google.

找到它们

我也花时间开始在 Eclipse Wiki 中记录它:

我认为你应该在相应的字段中实现execIsSaveNeeded()AbstractTableField 中的默认实现使用行的状态,但您可以想象您想要的逻辑。

@Order(10.0)
public class MyTableField extends AbstractTableField<MyTableField.Table> {

  @Override
  protected boolean execIsSaveNeeded() throws ProcessingException {
    boolean result;
    //some logic that computes if the table field contains modification (result = true) or not (result = false)
    return result;
  }

  //...

希望对您有所帮助。


I am looking for function that check for dirty fields and pops up message dialog, same as when closing form.

您是在用户单击表单中的“取消”时出现的消息框中发言吗?

没有您可以为此调用的特定函数。但是您可以检查 AbstractForm.doCancel() 函数的开头。这正是您要找的。

我改写成这样:

// ensure all fields have the right save-needed-state
checkSaveNeeded();
// find any fields that needs save
AbstractCollectingFieldVisitor<IFormField> collector = new AbstractCollectingFieldVisitor<IFormField>() {
  @Override
  public boolean visitField(IFormField field, int level, int fieldIndex) {
    if (field instanceof IValueField && field.isSaveNeeded()) {
      collect(field);
    }
    return true;
  }
};
SomeTestForm.this.visitFields(collector);

MessageBox.showOkMessage("DEBUG", "You have " + collector.getCollectionCount() + " fields containing a change in your form", null);

我已将访问者更改为收集所有未更改的值字段。但是你可以坚持原来的 visitField(..) 实现。您不能使用 P_AbstractCollectingFieldVisitor,因为它是私有的,但您可以在其他地方使用类似的现场访问者。

I am looking for a way to set fields dirty or not.

正如我告诉您的:execIsSaveNeeded() 在每个字段中用于某些自定义逻辑。您还可以在字段上调用 ​​touch() / markSaved() 以指示它是否包含修改。但除非你别无选择,否则我认为这不是适合你的正确方法。