valueChangeListener
যখন ফর্ম জমা হয় শুধুমাত্র প্রার্থনা করা হবে এবং পেশ মান প্রাথমিক মান থেকে আলাদা। কেবলমাত্র এইচটিএমএল ডিওএম change
ইভেন্ট নিক্ষেপ করা হলে এটি অনুরোধ করা হয় না । আপনি যদি এইচটিএমএল ডিওএম change
ইভেন্ট চলাকালীন ফর্মটি জমা দিতে চান তবে আপনাকে <f:ajax/>
ইনপুট উপাদানটিতে শ্রোতা (!) ছাড়াই অন্য একটি যুক্ত করতে হবে । এটি এমন একটি ফর্ম জমা দেবে যা কেবলমাত্র বর্তমান উপাদান (যেমন হিসাবে execute="@this"
) প্রক্রিয়া করে।
<h:selectOneMenu value="#{bean.value}" valueChangeListener="#{bean.changeListener}">
<f:selectItems ... />
<f:ajax />
</h:selectOneMenu>
<f:ajax listener>
পরিবর্তে ব্যবহার করার সময় valueChangeListener
, এটি ডিফল্টরূপে change
ইতিমধ্যে HTML DOM ইভেন্টের সময় কার্যকর করা হবে । UICommand
চেকবাক্স বা রেডিওবুটনের প্রতিনিধিত্বকারী উপাদান এবং ইনপুট উপাদানগুলির অভ্যন্তরে , এটি click
কেবলমাত্র এইচটিএমএল ডিওএম ইভেন্টের সময় সম্পাদিত হবে exec
<h:selectOneMenu value="#{bean.value}">
<f:selectItems ... />
<f:ajax listener="#{bean.ajaxListener}" />
</h:selectOneMenu>
আর একটি বড় পার্থক্য হ'ল valueChangeListener
এই PROCESS_VALIDATIONS
পর্বটি শেষ হওয়ার সময় পদ্ধতিটি চাওয়া হয় । এই মুহুর্তে, জমা দেওয়া মানটি এখনও মডেলটিতে আপডেট হয়নি। সুতরাং আপনি কেবল সিম সম্পত্তি অ্যাক্সেস করে তা পেতে পারবেন না যা ইনপুট উপাদানগুলির সাথে আবদ্ধ value
। আপনার এটি করা দরকার ValueChangeEvent#getNewValue()
। পুরানো মানটি উপায় দ্বারা উপলব্ধ ValueChangeEvent#getOldValue()
।
public void changeListener(ValueChangeEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
}
<f:ajax listener>
পদ্ধতি সময় প্রার্থনা করা হয় INVOKE_APPLICATION
ফেজ। এই মুহুর্তে, জমা দেওয়া মানটি ইতিমধ্যে মডেলটিতে আপডেট করা হয়েছে। আপনি কেবল বিনের সম্পত্তিটিতে সরাসরি প্রবেশ করে এটি পেতে পারেন যা ইনপুট উপাদানগুলির সাথে আবদ্ধ value
।
private Object value;
public void ajaxListener(AjaxBehaviorEvent event) {
System.out.println(value);
}
এছাড়াও, যদি আপনার জমা দেওয়া মানের উপর ভিত্তি করে অন্য কোনও সম্পত্তি আপডেট করার প্রয়োজন হয়, তবে আপনি যখন valueChangeListener
আপডেট হওয়া সম্পত্তিটি পরবর্তী পর্যায়ে জমা দেওয়া মান দিয়ে ওভাররাইড করতে পারেন তখন তা ব্যর্থ হবে UPDATE_MODEL_VALUES
। ঠিক এ কারণেই আপনি পুরানো জেএসএফ 1.x অ্যাপ্লিকেশন / টিউটোরিয়ালস / সংস্থানগুলিতে দেখতে পান যে valueChangeListener
এ জাতীয় নির্মাণের সাথে এটি সংমিশ্রণে ব্যবহৃত হয়েছিল immediate="true"
এবং FacesContext#renderResponse()
এটি ঘটতে রোধ করতে। সর্বোপরি, valueChangeListener
ব্যবসায়ের ক্রিয়া সম্পাদন করতে ব্যবহার করা আসলে সর্বদা সর্বদা একটি হ্যাক / ওয়ার্কআরাউন্ড।
সংক্ষিপ্ত বিবরণ: valueChangeListener
কেবলমাত্র যদি আপনার প্রকৃত মান পরিবর্তনের ক্ষেত্রে বাধা দেওয়া দরকার তবেই ব্যবহার করুন । অর্থাৎ আপনি আসলে পুরানো এবং নতুন মান উভয় (যেমন লগ ইন করার জন্য) আগ্রহী।
public void changeListener(ValueChangeEvent event) {
changeLogger.log(event.getOldValue(), event.getNewValue());
}
<f:ajax listener>
কেবলমাত্র যদি আপনাকে নতুন পরিবর্তিত মানের উপর কোনও ব্যবসায়িক ক্রিয়া সম্পাদন করার প্রয়োজন হয় তবেই ব্যবহার করুন । অর্থাৎ আপনি কেবলমাত্র নতুন মানটিতে আগ্রহী (যেমন দ্বিতীয় ড্রপডাউনটি তৈরি করা) pop
public void ajaxListener(AjaxBehaviorEvent event) {
selectItemsOfSecondDropdown = populateItBasedOn(selectedValueOfFirstDropdown);
}
আপনি যদি কোনও ব্যবসায়িক ক্রিয়া সম্পাদন করার সময় যদি পুরানো মানটিতে সত্যই আগ্রহী হন তবে তারপরে ফিরে যান valueChangeListener
, তবে এটিকে INVOKE_APPLICATION
পর্যায়টিতে সারি করুন ।
public void changeListener(ValueChangeEvent event) {
if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
event.queue();
return;
}
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
System.out.println(newValue.equals(value));
}
logger.trace( "setting changeTypes from {} to {}", this.changeTypes, changeTypes );