سؤال

عندي مشكلة مع JSFهل يمكن لأحد أن يقول لماذا لا ينجح هذا؟

<h:selectOneListbox
  id="lang" size="5"
  value="#{MbInstitution.node.lang}"
  valueChangeListener="#{MbInstitution.changeLanguage}"
  rendered="#{MbInstitution.view}"
  >
 <a4j:support event="onchange" reRender="shortDesc, fullDesc"/>
 <f:selectItems value="#{MbInstitution.languagesByInstitute}"/>
</h:selectOneListbox>
<h:selectOneListbox
  id="lang" size="5"
  disabled="#{!MbInstitution.managingNew}"
  value="#{MbInstitution.node.lang}"
  rendered="#{!MbInstitution.view}"
  >
 <f:selectItems value="#{MbInstitution.availableLanguages}"/>
</h:selectOneListbox>

انها تقول:"معرف مكرر لـ Instorm: Lang" أعلم أن لدي عنصرين مع نفس المعرف ، ولكن يتم تقديم واحد فقط عندما لا يكون آخر.لذلك، لم أكن أعتقد أنه سيكون مشكلة.في الواقع إنها ليست مشكلة كبيرة على الإطلاق لأنني لا أحتاج إلى هذا المعرف، ولكن ماذا لو كنت بحاجة إليه فماذا أفعل؟

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

المحلول

مشكلتك هي أن هذين المكونين جزء من شجرة مكونات JSF لهذه الصفحة.وحتى إذا لم يكن من الممكن عرضهما في نفس الوقت، فإنهما يشتركان في نفس المعرف، وهو أمر غير مسموح به بواسطة JSF.

أرى ثلاثة حلول لحل مشكلتك:

الحل الأول: تحديد معرفين مختلفين

الحل الثاني: يمكنك، كما أوضح واين يونغ، استخدام NamingContainer، والتي ستبدأ معرفها بمعرف NamingContainer.

الحل الثالث: استخدم واحدًا فقط <h:selectOneListbox/> ثم قم بإجراء الفرق في كود Java.

<h:selectOneListbox id="lang" size="5" disabled="#{!MbInstitution.managingNew}" value="#{MbInstitution.node.lang}" valueChangeListener="#{MbInstitution.changeLanguage}">
    <a4j:support event="onchange" reRender="shortDesc, fullDesc" rendered="#{MbInstitution.view}"/>
    <f:selectItems value="#{MbInstitution.languages}"/>
</h:selectOneListbox>

كود جافا:

public List<SelectItem> getLanguage() {
    if (isView()) {
        return getLanguagesByInstitute();
    } else {
        return getAvailableLanguages();
    }
}

public void changeLanguage(ValueChangeEvent evt) {
    if (!isView()) {
        return;
    }
    ...
}

نصائح أخرى

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

في جافادوك لUIComponent.setId () يقول:

<اقتباس فقرة>   

ويجب أن يكون المعرف المحدد   فريدة من نوعها بين جميع المكونات   (بما في ذلك الجوانب) التي هي   المتحدرين من أقرب سلف   UIComponent هذا هو NamingContainer،   أو في نطاق كامل   شجرة مكون إذا لم يكن هناك مثل   الجد الذي هو NamingContainer.

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