যখন ভ্যালু চ্যাঞ্জলিস্টনার বা এফ: অজ্যাক্স শ্রোতা ব্যবহার করবেন?


88

নীচের দুটি টুকরো কোডের মধ্যে পার্থক্য কী - listenerস্থান নির্ধারণের ক্ষেত্রে?

<h:selectOneMenu ...>
    <f:selectItems ... />
    <f:ajax listener="#{bean.listener}" />
</h:selectOneMenu>

এবং

<h:selectOneMenu ... valueChangeListener="#{bean.listener}">
    <f:selectItems ... />
</h:selectOneMenu>

উত্তর:


184

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; // +getter+setter.

public void ajaxListener(AjaxBehaviorEvent event) {
    System.out.println(value); // Look, (new) value is already set.
}

এছাড়াও, যদি আপনার জমা দেওয়া মানের উপর ভিত্তি করে অন্য কোনও সম্পত্তি আপডেট করার প্রয়োজন হয়, তবে আপনি যখন 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)); // true
    // ...
}

@ বালুসসি, নতুন মান যেটি পাস করা হয়েছে তাতে সেটারের আগে সেটারে ব্যাকিং অবজেক্ট থেকে পুরানো মানটি না পাওয়ার কোনও কারণ আছে? ভালো কিছু: । দেখে মনে হচ্ছে আপনি সেই ফ্যাশনে প্রাপ্ত পুরানো এবং নতুন মূল্যবোধগুলি সরাসরি সেটারে ব্যবসায়িক যুক্তি এবং সাধারণ লগিংয়ের জন্য ব্যবহার করতে পারেন, তবে আমি জানি না যে logger.trace( "setting changeTypes from {} to {}", this.changeTypes, changeTypes );
লুকাশ

নিখুঁত এবং সম্পূর্ণ উত্তর! তোমার অভিজ্ঞতা ভাগাভাগি করার জন্য ধন্যবাদ!
hbobenicio

@ বালাসসির দ্বারা অ্যাজাক্সবিভাওয়ের এভেন্টের মাধ্যমে পরিবর্তিত মান পাওয়া সম্ভব? আমার <এইচ: নির্বাচন করুন ম্যানিলিস্টবক্স যা অন্যান্য উপাদানগুলিতে বেঁধে রয়েছে এবং কিছু ক্রিয়া সম্পাদনের জন্য পরিবর্তিত (যুক্ত / সরানো) ব্যবহার করতে চাই
পাওলো


ধন্যবাদ @ বালুসসি তবে আমি মনে করি না যে মান হিসাবে আমার কিছু কার্যকর ও রেন্ডার মান রয়েছে যেমন ভ্যালু চ্যাঞ্জলিস্টনার আমার ক্ষেত্রে উপযুক্ত হবে <f: ajax ইভেন্ট = "মানচেন্জ" রেন্ডার = "পরীক্ষা" চালানো = "@ এই" শ্রোতা = "# {পরীক্ষা নিয়ন্ত্রক। প্রক্রিয়াটাইম টেবিল} "/>
পল্লো

9

প্রথম খণ্ডটির জন্য (এজাক্স শ্রোতার বৈশিষ্ট্য):

একটি অজ্যাক্স ট্যাগের "শ্রোতা" বৈশিষ্ট্যটি এমন একটি পদ্ধতি যা প্রতিবার ক্লায়েন্টের সাথে এজাক্স ফাংশনটি ঘটে সার্ভারের দিকে ডাকা হয়। উদাহরণস্বরূপ, আপনি এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন প্রতিবার ব্যবহারকারী কোনও কী চাপলে কল করার জন্য কোনও সার্ভার সাইড ফাংশন নির্দিষ্ট করতে

তবে দ্বিতীয় খণ্ড (মান চ্যাঞ্জলিস্টার):

যখন ফর্মটি জমা দেওয়া হয় কেবল তখনই ValueChangeListener বলা হবে, যখন ইনপুটটির মান পরিবর্তন করা হয় না

* আপনি এই সহজ উত্তর দেখতে পছন্দ করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.