سؤال

لدي مشكلة حيث يوجد selectOneMenu أن له قيمة لا بد أن دعم الفول.

أنا بحاجة إلى الزر الذي لا تحديث نموذج القيم (وهذا هو السبب في أنه قد الفوري="true" الملكية).

هذا الزر هو طريقة عمل تغيير قيمة selectOneMenu لا بد ، ولكن عندما تكون الصفحة يتم إعادة عرض القيمة الأصلية يتم عرض (الذي قدم) وليس مجموعة واحدة في طريقة العمل.

أي أفكار لماذا هذا يحدث ؟

إذا لم أشرح المشكلة جيدة بما فيه الكفاية واسمحوا لي أن أعرف.


تحرير:على النحو المطلوب هنا هو رمز مصدر في السؤال:

صفحة التعليمات البرمجية:

<h:selectOneMenu id="selectedPerson" 
                 binding="#{bindings.selectPersonComponent}" 
                 value="#{bean.selectedPerson}">
   <s:selectItems var="op" value="#{bean.allPersons}" 
                  label="#{op.osoba.ime} #{op.osoba.prezime}" 
                  noSelectionLabel="#{messages.selectAPerson}">
   </s:selectItems>
   <f:converter converterId="unmanagedEntityConverter" />
</h:selectOneMenu>
...
<a4j:commandButton action="#{bean.createNew}" value="#{messages.createNew}"
     immediate="true" reRender="panelImovine">
</a4j:commandButton>

كود جافا:

private Person selectedPerson;

public String createNew() {
    log.debug("New created...");
    selectedPerson = null;
    bindings.getSelectPersonComponent().setSubmittedValue(null); //SOLUTION
    return "";
}

الحل هو في اصطف ملحوظ الحل :)

هل كانت مفيدة؟

المحلول

كما يحدث في كثير من الأحيان لحظات قليلة بعد نشر هذا السؤال وجدت جوابا:

سبب المشكلة هو في التفاصيل هو موضح هنا: ClearInputComponents

المشكلة (كما هو موضح) هذا النموذج القيم لم يتم تحديثها حتى قدمت مساهمات لا تزال في العنصر.submittedValue المجال أن يتم عرض الحقل إذا كان غير فارغ.هو إفراغ عادة بعد نموذج تم تحديث.

الحل الأول لم ينجح في حالتي لأن هناك مهمة أخرى الدولة في الرأي لا يجب أن تضيع.ولكن الحل الثاني عملت كبيرة:

component.setSubmittedValue(null);

و هذا كان كل ما هو مطلوب:فمن القليل من العمل الإضافي لأن مكونات يجب أن يكون منضما إلى بعض الفول ، ولكن ليس بهذا السوء.

نصائح أخرى

متابعة قليلا, أنا لا أعتقد أنك تحتاج إلى ربط عنصر إلى الفول.يمكن أن تمسك مكون من FacesContext على سبيل المثال عن طريق UIViewRoot, إذا كنت تعرف المكون معرف العميل.

سيكون شيئا قليلا من هذا القبيل:

Foo component = (Foo)FacesContext.getCurrentInstance().getViewRoot().getComponent(clientId);

حيث Foo هي فئة من العنصر الذي تستخدمه ، clientId هو معرف العميل من عنصر في "formId:elementId" تنسيق JSF الاستخدامات.

بالنسبة لي, هذا وقد عملت:

@ManagedBean(name = "bean")
@ViewScoped
public class Bean {
    private SelectOneMenu component;

    public SelectOneMenu getComponent() {
        return selectComponent;
    }

    public void setComponent(SelectOneMenu component) {
        this.Component = component;
    }
    public void resetComponent() {
        component.resetValue();
    }
    ...
}
<h:selectOneRadio value="#{bean.value}" id = "idRadio" required="true" requiredMessage = "Required Message" binding="#{bean.component}" >
    <f:selectItem itemLabel="Value 1" itemValue="value1"/>
    <f:selectItem itemLabel="Value 2" itemValue="value2" />     
</h:selectOneRadio>

<primefaces:commandButton action="#{bean.resetComponent}" value="Erase" update="idRadio" immediate="true"/>
...

شكرا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top