لا يمكن تحديد حدث ما وربط في هذا الحدث في نفس الوقت

StackOverflow https://stackoverflow.com/questions/3870753

  •  28-09-2019
  •  | 
  •  

سؤال

لننظر في هذا الرمز البسيط:

<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.

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