JSF F: الحدث prerenderview يتم تشغيله بواسطة F: Ajax Calls و Partial Renders ، شيء آخر؟

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

  •  26-09-2019
  •  | 
  •  

سؤال

لذلك لدينا F: الحدث:

   <f:metadata>
    <f:event type="preRenderView" listener="#{dashboardBacking.loadProjectListFromDB}"/>
   </f:metadata>

الذي يتم تشغيله كما هو مطلوب في تحميل الصفحة الأولية (عرض).

ومع ذلك ، يتم تشغيل حدث Prerenderview هذا أيضًا من خلال عرض صفحة جزئي Ajax ، والذي يعيد عرض H: Panelgroup مع قائمة Projecting ، على النحو التالي.

<h:commandButton action="#{mrBean.addProject}" value="Create Project"
                                     title="Start a new project">
   <f:ajax render="projectListing" />
</h:commandButton>

أريد فقط أن يتم استدعاء لوحة القيادة. loadprojectlistfromdb لعرض الصفحة الأولية ، ولكن ليس عندما يكون هناك عرض جزئي Ajax. هل هناك حدث أو طريقة أكثر ملاءمة يمكن أن أستخدمها؟

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

المحلول

خيار آخر هو وضع الخاص بك preRenderView الوظيفة في أ @PostConstruct طريقة أ ViewScoped الفول المدارة. سيتم تنفيذ هذا المنطق عند تهيئة الفول ، وأنت تحافظ على نفس مثيل الفول لجميع طلبات AJAX حتى تقوم بتغيير طرق العرض.

نصائح أخرى

كان لدي نفس الحاجة منذ وقت طويل. انتهى بي الأمر باستخدام شيء اقترحه بالوس.

هناك طريقة في فئة FacesContext تتيح لك معرفة ما إذا كنت تتعامل مع طلب كامل أو معالجة جزئية من نوع ما:

FacesContext.getCurrentInstance().isPostback()

وبهذه الطريقة ، لا يزال بإمكانك استخدام تقنية prerenderview والتحقق مما إذا كان ذلك عبارة عن postback في المستمع. لقد وجدت ذلك مفيدًا بشكل خاص لأنني كنت بحاجة إلى حبة جلسة حيث كان على المستخدم الانتقال إلى صفحة أخرى والعودة. إذا استخدمت عرض الفاصوليا المنحنى (كما هو موضح أعلاه من قبل براين) ، فقد فقدت المعلومات التي كان لدي قبل التنقل بعيدًا.

الاحتمال الآخر هو التحقق مما إذا كان الطلب هو Ajax واحد أم لا في طريقة Prerenderview. يمكنك أيضًا تنفيذ الحمل بشكل مشروط مع الأخذ في الاعتبار العوامل الأخرى مثل إذا كان الطلب GET أو لا ، وإذا فشل التحقق من الصحة أم لا (يمكن أن تفشل التحقق من صحة المعلمة في صفحة الحصول على GET).

boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET") ? true : false;
boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest();
boolean validationFailed = fc.isValidationFailed();

تم وصف طريقة "العصر الجديد" للتعامل مع هذا هنا:

http://www.coderanch.com/t/509746/jsf/java/duplicate-call-prerenderview-event#2634752

يمكنك محاولة إرفاق مستمع حدث Prerenderview بمكون فردي ، بدلاً من الصفحة. اختر مكونًا لا يتم تقديمه أثناء طلب AJAX.

إحدى المشكلات الصغيرة هي أنه لم يتم تعيين معلمات العرض عندما تسمى طريقة postConstruct ، لذلك اضطررت إلى الحصول عليها بشكل صريح:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("theParam");

تحديث: في الواقع ، انتهى بي الأمر إلى القيام بشيء postconstruct ، هو أنظف كثيرًا.

واجهت نفس القضية بالضبط اليوم مع حبة دعم مدتها الجلسة. وهي ، قمت بتسجيل طريقة قائمة الأحداث على الفول المغطى بالجلسة التي تم تسجيلها في Prerenderview. لكنني وجدت أنه تم إطلاقه أيضًا على بعض عمليات فرز Ajax على مكون PrimeFaces 3 DataTable. لذا ، فإن ما انتهى بي الأمر هو استخدام متغير مثيل منطقي على حبة الدعم المغطاة بالجلسة للتأكد من تنفيذ جسم طريقة قائمة الأحداث في المرة الأولى فقط (تم تصرف المنطق كعلم). أنا متأكد من أنها ساذجة إلى حد ما وربما مكسورة في حالات معينة ، لذا سأكون مهتمًا بمعرفة السبب وكيف قد يفشل هذا النهج البسيط.

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