2016-05-12 6 views
2

У меня есть эта проблема относительно обновления некоторых элементов на моей странице zul. В настоящее время я использую MVC с ZK, а не MVVM. Я уже использовал elementId.invalidate(), но, похоже, этот метод не работал. Может кто-то, пожалуйста, помогите мне, как это сделать в MVC ZK?Метод invalidate() не обновляет веб-элемент в MVC ZK

Вот моя страница зул

<?xml version="1.0" encoding="UTF-8"?> 
<zk xmlns="http://www.zkoss.org/2005/zul"> 
<window border="none" apply="com.dorne.got.ui.far.there.FooComposer"> 
    <groupbox mold="3d" closable="false"> 
     <caption 
      label="${labels.generate.foo.forward}" /> 
      <grid fixedLayout="true"> 
       <columns> 
        <column width="20%" /> 
        <column width="80%" /> 
       </columns> 
       <rows>      
... 
... 
        <row> 
         <div> 
          <label 
           value="${labels.foo.fr.Name}" /> 
         </div> 
         <div> 
          <!-- constraint="/.+\.+|/: Please enter a valid Name" --> 
          <textbox id="txtName" width="10%" /> 
          <label id="lblErrorName" 
           style="color:red" /> 
         </div> 
        </row>      
       </rows> 
      </grid> 
     <div align="center"> 
      <separator /> 
      <button id="btnSubmit" 
       label="${labels.common.button.generate}" /> 
      <button id="btnClose" 
       label="${labels.common.button.cancel}" /> 
      <separator /> 
     </div> 
    </groupbox> 
</window> 

И вот мой MVC ZK композитор

public class RefreshLabelNameComposer extends WindowComposer { 


@Wire 
private Label lblErrorName 

@Override 
public void doAfterCompose(Window comp) throws Exception { 
    //skip this code 
} 

public longProcess() { 
//some long proccess 
} 

@Listen("onClick = #btnSubmit") 
public void btnSubmitClick() { 
    lblErrorName.setValue(""); 
    lblErrorName.invalidate(); 
    longProccess(); 
} 
} 

Пусть Предположим, после некоторого proccess, значение lblErrorName не пусто. После того, как я нажму кнопку «Отправить», незадолго до завершения процесса, lblErrorName не обновит свое значение до «». Я хочу, чтобы перед запуском длительной работы lblErrorName обновлялся до пустой строки, поэтому пользователь не видит ошибки при запуске метода longProccess. Я думаю, проблема заключается в том, как метод invalidate() работает с MVC ZK, но я не уверен, в чем проблема. Может кто-нибудь, пожалуйста, помогите, как это исправить? Большое спасибо

Edit: Я использую ZK 7

Edit 2: Я уже пытался

lblErrorName.setVisible(!lblErroName.isVisible()); 
lblErrorName.setValue(""); 
lblErrorName.setVisible(!lblErroName.isVisible()); 

, но до сих пор элемент этикетки lblErrorName обыкновение обновить пустую строку

ответ

1

Вы впадаете в ловушку, с которой у большинства людей проблемы.
Это не имеет никакого отношения к MVC или MVVM, и даже invalidate() никогда не будет работать в то время, когда вы захотите.
Причина в том, что длительность вашего метода (длительная операция) не дает обратной связи клиенту.
Другими словами, обратная связь отправляется при длительной операции.
Есть несколько способов реализовать это, но I prefer a great abstract solution created by Robert Wenzel of potix.
Реализация такая же, только то, что находится в @Command, будет в вашем @Listen.

В противном случае, если вы не хотите этого делать, I suggest you just echo an event.
Эхо-событие означает, что вы переходите к клиенту, и клиент инициирует это событие непосредственно после получения ответа.
Это хорошее решение, когда у вас мало длинных операций, но сложнее увидеть, что происходит дальше.

+1

+1 для связи. Во-первых, это превосходное дополнение к моим знаниям, как упростить длительный процесс в zk. Во-вторых, хотя он не отвечает на мой вопрос напрямую, метод echoEvent упоминается в статье, и я использовал его. Он может принудительно вызвать любое событие, а так как после вызванного события страница автоматически обновляется. Спасибо, btw – Barjack