-
FEATURED COMPONENTS
First time here? Check out the FAQ!
Is it possible to use API Future with ZK 9.6.1 ?
Example: Load some lists by calling Web Service:
ClientBuilder.newClient()
.target(url)
.path("general/companies")
//.path("general/systems/{id}")
//.resolveTemplate("id", 20)
.request()
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.rx()
.get()
.thenApply(response -> response.readEntity(new GenericType<List<Company>>() {} ) )
.thenAccept(r -> updateCompanyList(r))
And update components in ZUL page (combobox):
@SmartNotifyChange(["listCompany"])
void updateCompanyList(Object data){
listCompany?.clear()
listCompany = data
}
When I execute this code, I see the call to the Web Service, but nothing is loading in the combobox. Thanks for your help.
Based on your description, what probably happens is:
1 - ZK server receives the client's request (triggering your command) 2 - You start the future operation 3 - ZK server sends the response back to the client (without modifications, since nothing has changed at server side) 4 - the future operation is completed, and you call the updateCompanyList method as callback.
ZK will not automatically wait for async operations to finish before sending the response. If you want to update the UI after the async operation has taken place, you will need to enable server push.
Server push is a ZK feature that let the server initiate an execution (a transaction that updates the client). Usually, transactions are initiated by a user action at client-side (click on component, etc.). With server push, you can activate a desktop from server side directly and push an update to the client without having to wait on user activity.
See the server push documentation for more info.
Here's a simple example of how activating / deactivating desktops lets you update the client:
https://zkfiddle.org/sample/7u68dh/3-async-listeners-without-event-queue#source-2
NOTE: The @smartNotifyChange might not work in that context. You may need to force a notifyChange on the VM field(s) that you need to push the the client after update. I recommend using the BindUtils.postNotifyChange option if you are doing this "in java code", since the annotations mostly expect default workflows.
Have a look, and let me know if that's what you are trying to do, or if you are encountering other issues.
Asked: 2022-05-16 15:24:50 +0800
Seen: 11 times
Last updated: May 17