Hi Erik, OK, well, as you know, any time the view model is interacted with it, Isis basically reconstructs the view model; it is completely stateless architecture and the view model's state is basically the information in its OID (=URL).
I think for your use case it might be worth introducing some sort of server-side state, so that the view model's OID is basically a key to that server-side state (a UUID would suffice). Then the question is how to hold that server-side state. An HTTP Session object is one option; the other is to store the data in the database. That basically means converting the view model into an entity (analogous to a shopping cart entity); you could have some mechanism to clean up such session entities after a day or two. Hope that helps provide some ideas... Cheers Dan On 1 April 2015 at 11:33, Erik de Hair <[email protected]> wrote: > > On 03/27/2015 12:26 PM, Dan Haywood wrote: > >> Hi Erik, >> >> On 25 March 2015 at 12:42, Erik de Hair <[email protected]> wrote: >> >> Hi, >>> >>> I have to call I web service from a view model but, when opening the view >>> model, the call to the web service is called twice. It doesn't matter if >>> the call is in de viewmodelinit or in some other method. May be there's >>> some way to track the state of the view model and let whether or not the >>> call is executed depend on that? >>> >>> My guess is that you are seeing the view model called twice because we >> use >> (Wicket's support for) the redirect-after-post pattern. >> >> That is, when the action is invoked you are instantiating the view model >> (which calls the webservice), and then we return a 302 redirect to the >> browser so that it then re-requests the same URL, causing the view model >> to >> be recreated (and that webservice called). >> >> Perhaps you could confirm if that's what's happening? >> > The following is happening... > > In the initial state the view model is rendered and the data that is > needed to call the web service is already available from the view model > memento. (This means that when refreshing the page the web service will be > called again. This is not much of a problem.) > > Now, when clicking** the action button that opens the action for > re-entering the web service parameters, a request for the view model is > done: > > 0:0:0:0:0:0:0:1 - - [01/Apr/2015:12:04:09 +0200] "GET > /portal/wicket/entity/*nl.pocos.dom.access.availability.PostalCodeCheck: > PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGpzb24- > eyJwb3N0YWxDb2RlIjoiNTYxNEFFIiwiaG91c2VOdW1iZXIiOiIxNTIifTwv > anNvbj48L21lbWVudG8-?6-1.IBehaviorListener.0-theme-entity-entity~0- > entityPropertiesAndCollections-entityProperties-leftColumn- > memberGroup-1-properties-4-property-scalarIfRegular-additionalLinks- > additionalLinkList-additionalLinkItem-0-additionalLink&_=1427882228283 > HTTP/1.1" 200 12838 http-bio-8081-exec-4 2303 > > This way the web service is called again because the previous web service > parameters are still available from the view model memento. > > After submitting the following requests are handled: > > 0:0:0:0:0:0:0:1 - - [01/Apr/2015:12:06:17 +0200] "POST > /portal/wicket/entity/*nl.pocos.dom.access.availability.PostalCodeCheck: > PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PGpzb24- > eyJwb3N0YWxDb2RlIjoiNTYxNEFFIiwiaG91c2VOdW1iZXIiOiIxNTIifTwv > anNvbj48L21lbWVudG8-?6-1.IBehaviorListener.1-theme- > actionPromptModalWindow-content-parameters-inputForm-okButton HTTP/1.1" > 200 91 http-bio-8081-exec-6 169 > > (web service called two times during this request) > > 0:0:0:0:0:0:0:1 - - [01/Apr/2015:12:06:19 +0200] "GET > /portal/wicket/wicket/page?7 HTTP/1.1" 200 167629 http-bio-8081-exec-6 2582 > > (web service called once during this request) > >> >> If it is, then one option might be to defer the fetching of the data until >> as late as possible, ie when it needs to be constructed. >> > I tried this but the method that exposes the data to the gui will always > call the method that fetches the data when constructing the view model. So > no matter how late the data will be fetched, it will always be fetched. > >> >> Another option might be to have the view model use the HttpSession (via >> isis-module-servletapi addon) to keep track of state. >> > I'm still using Isis 1.7.0 and Eclipse complains about the module missing > some dependency. It does work however and I can prevent the web service > from being called by checking for a request method of GET during the > POST-request but there are still 3 calls left. > > I didn't use the session object yet. Will try that. > > >> HTH >> Dan >> >> >> >> The web service is fetching data, triggered by an action in the view >>> model, for the same view model. Do I always have to return a new view >>> model >>> with the fetched data in it or can I use the data from the fetch method >>> and >>> return the same view model? >>> >>> Thanks, >>> Erik >>> >>> >
