Hello All
This post is next in series of "Working with ADF Faces Components programmatically"
Previous posts are-
Creating dynamic layout (form and UI Component) using ADF Faces
Get Value from programmatically created components , Iterate over parent component to get child values in ADF Faces
Apply ActionListener to programmatically created buttons/link in ADF
Now this post is about applying client listener & server listener (to execute some javascript function) to a programmatically created component (inputText, outputText etc)
Let's see the implementation part (Jdev 12.13) -
This is how we can apply javascript in programmatic created components
Cheers :) Happy Learning
This post is next in series of "Working with ADF Faces Components programmatically"
Previous posts are-
Creating dynamic layout (form and UI Component) using ADF Faces
Get Value from programmatically created components , Iterate over parent component to get child values in ADF Faces
Apply ActionListener to programmatically created buttons/link in ADF
Now this post is about applying client listener & server listener (to execute some javascript function) to a programmatically created component (inputText, outputText etc)
Let's see the implementation part (Jdev 12.13) -
- First created a FusionWebApplication and a page in viewController project
- Dropped a button on page , on this button action i will create an inputText programmatically
- To create new inputText i have added following code (described in previous posts)
- Now first part is done - Creation of input text , next is to assign client and server listener to it
So for that first we have to add some JavaScript function in page that will be called using clientListener
I have added this JavaScript function in page, it just fires a custom event from client and pass component value as parameter - One more thing is to define server listener method in managed bean so that we can apply it to inputText at run time
- Now create clientListener/ServerListener programmatically and assign both to inputText
Pass server listener method name along with managed bean name
/**Method to add dynamically created component to a parent layout * @param parentUIComponent * @param childUIComponent */ public void addComponent(UIComponent parentUIComponent, UIComponent childUIComponent) { parentUIComponent.getChildren().add(childUIComponent); AdfFacesContext.getCurrentInstance().addPartialTarget(parentUIComponent); }
//Code to create af:inputText and add it to panelgroup layout RichInputText ui = new RichInputText(); ui.setValue("Programmatically Created Input Text"); ui.setId("pit1"); ui.setContentStyle("width:200px;color:navy"); //getParentGroupLayoutBind is the component binding of parent panel group layout addComponent(getParentGroupLayoutBind(), ui);
function demoJsFunction(evt){ var comp = evt.getSource(); alert(comp); AdfCustomEvent.queue(comp, "ServerEventToGetValue", {fvalue:comp.getSubmittedValue()}, true); evt.cancel(); }
/**Server Listener - It will be called on execution of client side javascript * @param clientEvent */ public void testServerListener(ClientEvent clientEvent) { //To get value passed from Client Event String val = clientEvent.getParameters().get("fvalue").toString(); FacesMessage msg=new FacesMessage("Server Listener Called and value in inputText is - " + val); msg.setSeverity(FacesMessage.SEVERITY_INFO); FacesContext.getCurrentInstance().addMessage(null, msg); }
// Create new Client Listener and assign method name and type ClientListenerSet CL = new ClientListenerSet(); CL.addListener("click", "demoJsFunction"); //Add Server listener , assign client event name and resolve pre-defined serverlistener CL.addCustomServerListener("ServerEventToGetValue", getMethodExpression("#{viewScope.Testbean.testServerListener}")); // Add clientListener/ServeListener to inputText ui.setClientComponent(true); ui.setClientListeners(CL);
Helper method to resolve expression-
- All done , now run application and check , click on button it will create a inputText
/**To Resolve ServerListener method * @param s * @return */ public MethodExpression getMethodExpression(String s) { FacesContext fc = FacesContext.getCurrentInstance(); ELContext elctx = fc.getELContext(); ExpressionFactory elFactory = fc.getApplication().getExpressionFactory(); MethodExpression methodExpr = elFactory.createMethodExpression(elctx, s, null, new Class[] { ClientEvent.class }); return methodExpr; }
This is how we can apply javascript in programmatic created components
Cheers :) Happy Learning
HI ,
ReplyDeleteI did same but I'm getting belwo error in console.
Uncaught TypeError: Cannot read property 'getSource' of undefined
java.util.Set clientAttributes = new HashSet();
clientAttributes.add("personsMap");
this.clientButton.setClientAttributes(clientAttributes);
this.clientButton.getAttributes().put("personsMap",locatiosnLst);
clientButton is the binding for UI button and I'm doing businesslogic in action listener after that I'm calling javascript .
calljavascript("doNavigate()");
private void calljavascript(String script ){
org.apache.myfaces.trinidad.render.ExtendedRenderKitService service =
org.apache.myfaces.trinidad.util.Service.getRenderKitService(FacesContext.getCurrentInstance(),
ExtendedRenderKitService.class);
service.addScript(FacesContext.getCurrentInstance(), script);
}
function doNavigate(evt) {
var maplist = evt.getSource().getProperty("personsMap");
}
Hi Vinod
DeleteWhere you have adeed this JavaScript function ?
function doNavigate(evt) {
var maplist = evt.getSource().getProperty("personsMap");
}
is it under map component ?
Ashish