لا يمكن تحديد حدث ما وربط في هذا الحدث في نفس الوقت
سؤال
لننظر في هذا الرمز البسيط:
<h:form id="myForm">
<h:inputText id="myInput">
<a4j:support event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>
</h:form>
سيؤدي هذا إلى إنشاء رمز HTML التالي:
<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="A4J.AJAX.Submit(...)" />
الآن ، أنا فقط أضيف شيئًا في onchange
حدث بلدي <h:inputText>
:
<h:form id="myForm">
<h:inputText id="myInput" onchange="alert('foobar');">
<a4j:support event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>
</h:form>
سيؤدي هذا إلى إنشاء رمز HTML التالي:
<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="alert('foobar');" />
كما ترون ، رمز أياكس هو غير مضافة أي أكثر من ذلك. هذا سلوك غريب حقًا بقدر ما أشعر بالقلق. لماذا <a4j:support>
لا يرفق مكالمة AJAX إذا تم تعريف الحدث بالفعل في حقل الإدخال؟
لذا فإن سؤالي هو كيفية صنع <a4j:support>
العمل على event
تم تعريفه بالفعل في input
؟ بالطبع ، يجب تشغيل الحل على حد سواء رمز JavaScript المحدد في onchange
و مكالمة AJAX.
بعبارة أخرى ، أود الحصول على HTML التالية:
<input id="myForm:myInput" type="text" name="myForm:myInput" onchange="alert('foobar'); A4J.AJAX.Submit(...)" />
أنا أستخدم Richfaces 3.3.2 و JSF 1.2
تعديل
بالطبع ، يمكنني تحريك onchange
رمز JavaScript في onsubmit
سمة من <a4j:support>
, ، القيام بشيء من هذا القبيل:
<h:inputText id="myInput">
<a4j:support onsubmit="alert('foobar');" event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>
ولكن هل هي الطريقة الوحيدة ؟؟
المحلول 3
المزيد عن السياق
في الواقع ، لا يمكنني حقًا تعديل event
قيمة <a4j:support>
, ، مثل الاقتراح بواسطة أبيل موريلوس, ، لأن ما أحاول القيام به هو إضافة مكون مخصص يقوم بتنفيذ بعض التحقق من صحة من جانب العميل. هذا التحقق من الصحة يطلق على وظيفة JavaScript ، لذلك يعدل المكون المخصص الخاص بي onchange
قيمة والديه.
سيبدو رمز JSF الخاص بي:
<h:inputText id="myInput">
<my:validation .../>
<a4j:support event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>
هذا الرمز مكافئ تمامًا للرمز التالي ، باستثناء أن onchange
التابع <h:inputText>
يضاف تلقائيا عن طريق المكون الخاص بي:
<h:inputText id="myInput" onchange="if (!checkSomeValidation()) { return false; }">
<a4j:support event="onchange" actionListener="#{myBean.doSomething}"/>
</h:inputText>
لذلك كما يمكنك أن تفهم ، يعدل المكون المخصص مباشرة onchange
حدث <h:inputText>
, وبسبب المشكلة مع <a4j:support>
, ، مكالمة أياكس ليس ملتصق بمكون الإدخال في النهاية.
الحل
عند ربط مكون JSF ، <a4j:support>
سوف "يتحول" نفسه إلى جانب ، اسمه org.ajax4jsf.ajax.SUPPORTxxx
, ، أين xxx
هل event
اسم. لذلك في حالتي ، <h:inputText>
سوف يكون له جوانب اسمه org.ajax4jsf.ajax.SUPPORTonchange
.
إذن ما أقوم به في رمز Java الخاص بي من مكوني المخصص ، هو التحقق مما إذا كان الوالد ( <h:inputText>
هنا) ، لديه مثل هذا الوجه.
إذا رقم, ، يعني أن الوالد ليس لديه <a4j:support event="onchange"/>
مرتبط به. لذلك في هذه الحالة ، أقوم بتعديل onchange
سمة بلدي <h:inputText/>
إذا نعم, ، يعني أن هناك ملف <a4j:support event="onchange"/>
مرتبط بالوالد. لذلك أقوم بتعديل الوجه نفسه باستخدام الكود التالي:
HtmlAjaxSupport facet = (HtmlAjaxSupport) getParent().getFacet("org.ajax4jsf.ajax.SUPPORTonchange");
if (facet != null) {
facet.setOnsubmit("my Javascript code goes here");
} else {
getParent().setOnchange("my Javascript goes here");
}
نصائح أخرى
إذا لم يتم توثيق هذا السلوك بشكل صريح ، فسأعتبر هذا خطأً في AJAX4JSF. أبلغ عن ذلك إلى Ajax4JSF/Richfaces Guys هناك على jboss.org. لدي رأيت مثل هذه المشاكل من قبل مع <a4j:commandButton onclick="someFunction()">
لقد واجهت هذه المشكلة بالفعل من قبل ، ووجدت أن Richfaces 3.3.x سيقوم فقط بتنفيذ الكود لحدث OnChange المحدد باستخدام A4J: الدعم وسيتجاهل رمز OnChange المحدد مع مكون JSF.
في حالتي ، كان الحل البديل بسيطًا ، بالنسبة لحالتي ، كان من الجيد استخدام حدث آخر بدلاً من "onchange" (لست متأكدًا مما إذا كان onclick أو onSelect) ، لذلك قمت بتوصيل الكود الخاص بي بهذا الحدث الآخر وعملت الكود الخاص بي ، لكنني لست متأكدًا مما إذا كان هذا يمكن أن ينجح لك. إذا كنت بحاجة حقًا إلى حدث OnChange لكلا العنصرين ، فسيتعين عليك القيام به تمامًا كما قال Balusc والإبلاغ عنه إلى الأشخاص Richfaces.