2012-02-27 15 views
7

यह हर बार जब मैं एक नए मंच जानने की तरह लगता है के लिए एक लटकती अद्यतन करते हैं, मैं इस वही पुरानी समस्या फिर से हल करना है। इस बार ढांचा विकेट है।विकेट अजाक्स एक और

मैं दो संस्थाओं मैं फू और बार फोन करता हूँ, और प्रत्येक फू एक वर्ग है, जो एक enum फू करने के लिए आंतरिक है। इसके अलावा, वहाँ अतिभारित find() तरीकों के साथ एक FooDAO मौजूद है: कोई आर्ग संस्करण रिटर्न डीबी में सभी फू, या कि गैर शून्य मान में सभी फू मिलान फिल्टर रिटर्न प्रकार फू के एक परमाटर "फिल्टर" के साथ एक संस्करण।

ग्राहक जब एक नया बार बनाने बार्स को Foos संबद्ध करने के लिए, लेकिन एक जोड़ने से पहले Foos फिल्टर करने के लिए श्रेणी के द्वारा चाहता है। तो मान लीजिए कि एक मुट्ठी भर फू पहले से मौजूद है, प्रत्येक श्रेणी के साथ। एक उपयोगकर्ता बार बार पेज और अनुभाग को नया फू जोड़ने के लिए जाता है: ड्रॉपडाउन ए श्रेणियों की सूची देता है, और किसी श्रेणी की पसंद पर, ड्रॉपडाउन बी को उस श्रेणी में उपलब्ध फ़ू की सूची को अजाक्स अपडेट के माध्यम से दिखाया जाना चाहिए। ध्यान दें कि कोई श्रेणी नहीं चुनी गई है, ड्रॉपडाउन बी को सभी उपलब्ध फू दिखाना चाहिए।

<form wicket:id="createBarForm"> 
<div> 
    <label>Category</label> 
    <select wicket:id="category"> 
    </select> 
</div> 
<div> 
    <label>Available Foo(s)</label> 
    <select class="xlarge" wicket:id="selectedFoo"> 
    </select> 
</div> 
<button style="float:right;">Add</button> 

<!-- and more Bar related fields --> 
</form> 

(। बटन अंत में अपनी ही आईडी और व्यवहार मिल जाएगा, लेकिन अभी फोकस सूची में है)

यहाँ जावा है:

मेरे एचटीएमएल एक छोटे से इस तरह दिखता है पक्ष (पेज के निर्माता विधि में):

createBarForm = new Form<Bar>("createBarForm", 
      new CompoundPropertyModel<Bar>()); 

    final List<Foo> availableFoo = fooDao.find(); 

    final FormComponent<Foo> selectedFoo = 
      new DropDownChoice<Foo>("selectedFoo", 
        Model.of(new TechnologyFoo()), availableFoo); 

    Foo.Category categoryStandin = null; 

    final FormComponent<Foo.Category> fooCategory = 
      new DropDownChoice<Foo.Category> 
       ("fooCategory", Model.of(categoryStandin), 
         Arrays.asList(Foo.Category.values())); 

    fooCategory.add(new AjaxFormComponentUpdatingBehavior("onchange") { 
     private static final long serialVersionUID = 1L; 
     @Override 
     protected void onUpdate(AjaxRequestTarget target) { 
      // re-set the form component 
      availableFoo.clear(); 
      ((DropDownChoice<Foo>)selectedFoo).setChoices(availableFoo); 
      createBarForm.remove(selectedFoo); 

      Foo.Category newSelection = 
        fooCategory.getModelObject(); 
      if (newSelection != null) { 
       Foo filter = new Foo(); 
       filter.setCategory(newSelection); 
       availableFoo.addAll(fooDao.find(filter)); 
      } 
      else { 
       availableFoo.addAll(fooDao.find()); 
      } 
      // re-fresh the form component 
      ((DropDownChoice<Foo>)selectedFoo).setChoices(availableFoo); 
      createBarForm.add(selectedFoo); 
     } 
    }); 

    createBarForm.add(fooCategory); 
    createBarForm.add(selectedFoo); 

    // etc..... 

मैं अपने logger.debug कॉल नहीं दिखाया, लेकिन उनके साथ मैं दिखाने के लिए कि newSelection किया जा रहा है कर रहा हूँ सही ढंग से कब्जा कर लिया, और डीएओ फू की अपेक्षित सूची लौट रहा है। इसके अलावा, avaliableFoo सूची में आवश्यक मूल्य भी शामिल हैं। हालांकि, श्रेणी चयन के पर ध्यान दिए बिना ड्रॉपडाउन बी हमेशा फू की पूरी सूची दिखाता है।

+1

देखकर के रूप में आप सही जवाब मिल गया है के रूप में, यह एक sidenote पर है: मैं शायद लटकती विकल्प घटकों के संबंधित मॉडल में चयन/चुनाव को अद्यतन करने के लिए कदम कोड और बस चाहते हैं 'UpUpdate() 'विधि में' target.addComponent() 'कॉल करें, आपका कोड पढ़ने और बनाए रखने के लिए बहुत आसान होगा। – biziclop

उत्तर

5

आप AjaxRequestTarget करने के लिए अपने ड्रॉपडाउन जोड़ने के लिए मिल गया है या वे अद्यतन नहीं किया जाएगा।

में

target.add(selectedFoo); 
+0

मुझे भी 'selectFoo.setOutputMarkupId (true) जोड़ना होगा, लेकिन ऐसा लगता है कि यह काम कर रहा है। – cobaltduck

संबंधित मुद्दे