2011-03-04 1 views
0

3 개의 LoadableDetachableModels가 있습니다. 그들의 load 메소드에서 (나는 같은 클래스의) 전역 변수를 호출한다. 두 경우 모델은 잘 작동합니다 (testModel1() 메서드 및 testModel3();).Wicket LoadableDetachableModel 업데이트 문제

BUT! testModel2(); 이 페이지를 처음 호출 할 때 남은 값입니다.

나는 그것이 어떻게 가능할까요?

처음에는 init 다음에 ResourceReference를 변경할 수 없다고 생각했습니다. 그러나 testModel3() 메서드는 그렇지 않으면 나를 증명했습니다. (이 방법은 올바르게 작동합니다). pastebin.com에

링크 : http://pastebin.com/jiFVWMMW

OUPUT : testModel1 값 객체를 구성

= testModel2 값 25.26.609 = testModel2 값 25.26.609 = 25.26.609에 testModel3 값 = 25.26.671 in testModel3 값 = 25.26.671 개체를 testModel1 값으로 생성 = 25.31.625 testModel2 값 = 25.26.609testModel1 값 객체를 구성 testModel2 값 = 363,210 testModel3 값 25.26.609 = testModel3 값 25.31.640 = 25.31.640 = testModel2 값 25.32.125 = testModel2 값 25.26.609 = 25.26. testModel3 값 = 609 testModel3 값 25.32.140 = 25.32.140

번호 :

package app.web; 

import java.util.HashMap; 
import java.util.Map; 
import org.apache.wicket.Resource; 
import org.apache.wicket.ResourceReference; 
import org.apache.wicket.markup.html.WebPage; 
import org.apache.wicket.markup.html.basic.Label; 
import org.apache.wicket.markup.html.resources.StyleSheetReference; 
import org.apache.wicket.model.LoadableDetachableModel; 
import org.apache.wicket.util.resource.IResourceStream; 
import org.apache.wicket.util.resource.StringResourceStream; 
import org.apache.wicket.util.time.Time; 
import org.wicketstuff.annotation.mount.MountPath; 

/** 
* HomePage 
*/ 
@MountPath(path = "home") 
public final class HomePage extends WebPage { 

    private static final long serialVersionUID = 1L; 
    private static final String DATE_FORMAT = "mm.ss.SS"; 
    transient private final Map cssMap; 

    public HomePage() { 
     System.out.println("Constructing object"); 
     cssMap = new HashMap(); 
     cssMap.put("time", Time.now().toString(DATE_FORMAT)); 
    } 

    @Override 
    protected void onBeforeRender() { 
     testModel1(); 
     testModel2(); 
     testModel3(); 
     super.onBeforeRender(); 
    } 

    /** 
    * working just fine 
    */ 
    private void testModel1() { 
     add(new Label("message1", new LoadableDetachableModel() { 

      private static final long serialVersionUID = 1L; 

      @Override 
      protected String load() { 
       System.out.println("in testModel1 value = " + ((String) cssMap.get("time"))); 
       return ((String) cssMap.get("time")); 
      } 
     })); 
    } 

    /** 
    * DOES NOT UPDATE!!!! (load is being called, but cssMap has original value. WTF?! 
    */ 
    private void testModel2() { 
     add(new StyleSheetReference("cssReference", new ResourceReference("testcss.css") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      protected Resource newResource() { 
       return new Resource() { 

        private static final long serialVersionUID = 1L; 

        @Override 
        public IResourceStream getResourceStream() { 
         LoadableDetachableModel LDM = new LoadableDetachableModel() { 

          private static final long serialVersionUID = 1L; 

          @Override 
          protected String load() { 
           System.out.println("in testModel2 value = " + ((String) cssMap.get("time"))); 
           return ((String) cssMap.get("time")); 
          } 
         }; 

         return new StringResourceStream(LDM.getObject()); 
        } 
       }; 
      } 
     })); 
    } 

    /** 
    * work just fine - StyleSheet is changing... 
    */ 
    private void testModel3() { 
     add(new StyleSheetReference("cssReference2", new ResourceReference("testcss2.css") { 

      private static final long serialVersionUID = 1L; 

      @Override 
      protected Resource newResource() { 
       return new Resource() { 

        private static final long serialVersionUID = 1L; 

        @Override 
        public IResourceStream getResourceStream() { 
         LoadableDetachableModel LDM = new LoadableDetachableModel() { 

          private static final long serialVersionUID = 1L; 

          @Override 
          protected String load() { 
           System.out.println("in testModel3 value = " + Time.now().toString(DATE_FORMAT)); 
           return Time.now().toString(DATE_FORMAT); 
          } 
         }; 

         return new StringResourceStream(LDM.getObject()); 
        } 
       }; 
      } 
     })); 
    } 
} 

HTML 태그 :

012,369,442 976,335,326,335,218,393,210

testcss.css : $ {시간}

testcss2.css : $ {시간}

+1

가 왜 onBeforeRender에서 LDMS를 초기화 할()? 그리고 왜 cssMap (LDM2에 대한 지지자)이 일시적입니까? – bert

+1

'delete delete'을 게시 할 필요가 없습니다. 질문을 삭제할 수있는 링크가 있습니다. 그것을 사용하십시오. – Nishant

답변

1
LoadableDetachableModel LDM = new LoadableDetachableModel() 

이 모델은 분리되지 않으며,이 구성 요소에 바인딩 않습니다. 구성 요소 바인딩 모델은 구성 요소가 분리 될 때 자동으로 분리되며이 모델은 분리되지 않으므로 값은 항상 동일하게 유지됩니다.

이 같은 클래스 구조 조정을 경우 작동합니다 :

// model should be a field, so detachModels() can see it 
private IModel<String> LDM = new LoadableDetachableModel<String>() { 

    private static final long serialVersionUID = 1L; 

    @Override 
    protected String load() { 
     System.out.println("in testModel3 value = " + Time.now().toString(DATE_FORMAT)); 
     return Time.now().toString(DATE_FORMAT); 
    } 
}; 

public void detachModels() { 
    super.detachModels(); 
    // detach the model 
    LDM.detach(); 
} 

private void testModel3() { 
    add(new StyleSheetReference("cssReference2", new ResourceReference("testcss2.css") { 

     private static final long serialVersionUID = 1L; 

     @Override 
     protected Resource newResource() { 
      return new Resource() { 


       private static final long serialVersionUID = 1L; 

       @Override 
       public IResourceStream getResourceStream() { 
        return new StringResourceStream(LDM.getObject()); 
       } 
      }; 
     } 
    })); 
}