hi, thanks a lot.

I have done it with a LDM and overriding the isVisible and onDetach method:

        model = new LoadableDetachableModel<List<String>>() {

            @Override
            protected List<String> load() {
                List<String> locationsNotInRoute = Lists.newArrayList();
                List<String> locationsInRoute = Lists.newArrayList();

                for (Route route : routingModel.getObject()) {
                    for (Location location : route.getLocations()) {
                        locationsInRoute.add(location.getOntologicalName());
                    }
                }


                for (Poi poi : user.getSelectedPois()) {
                    if (!locationsInRoute.contains(poi.getOntologyLocalName())) 
{
                        locationsNotInRoute.add(poi.getName());
                    }
                }

                return locationsNotInRoute;
            }

        };
                
                
                ListView<String> locationsNotInRoutesView = new 
ListView<String>("locationsNotInRoutes", model) {

                            @Override
                            protected void populateItem(ListItem<String> 
listItem) {
                                listItem.add(new Label("locationNotInRoute", 
listItem.getModel()));

                                listItem.setOutputMarkupId(true);
                            }

                            @Override
                            public boolean isVisible() {
                                return calculationDone && 
model.getObject().size() > 0;
                            }

                        };


@Override
public void onDetach() {
    if(model != null)
       model.detach();

    super.onDetach();
}




> Am 10.05.2015 um 14:25 schrieb Tobias Soloschenko 
> <[email protected]>:
> 
> Hi,
> 
> have a look at models in the user guide there are some good approaches to 
> update them.
> 
> Visibility:
> 
> ResourceLink pl = new ResourceLink("pdfLink", new 
> ByteArrayResource("application/pdf")) {
> 
> // visibility method
> 
> }
> 
> kind regards
> 
> Tobias
> 
>> Am 10.05.2015 um 14:15 schrieb Chris <[email protected]>:
>> 
>> Hi Tobias,
>> 
>> I have followed your approach (update from parent) and it works. Thanks a 
>> lot.
>> But could you show me also how to overwrite the visibility directly in the 
>> ResourceLink?
>> ResourceLink pl = new ResourceLink("pdfLink", new 
>> ByteArrayResource("application/pdf") {…}?
>> 
>> By the way, in the panel I have added another list view which does not use 
>> the model of the panel but has to calculate the model dynamically.
>> With the following code, it seems also to be only called once in the 
>> constructor but not via ajaxUpdate. How to change this?
>> 
>> ListModel<String> listModel = new ListModel<String>() {
>>          @Override
>>                   public List<String> getObject() {
>> 
>> Thanks, Chris
>> 
>> 
>>> Am 09.05.2015 um 20:38 schrieb Tobias Soloschenko 
>>> <[email protected]>:
>>> 
>>> In your snippet you put the isVisible in the ByteArrayResource. That's why 
>>> you get the error message - move it to your ResourceLink 
>>> 
>>> One easy way to update from parent would be: make a method in your panel 
>>> which returns your link then make your panel a field in the parent and call 
>>> the getter in the callback and add the link to your AjaxRequestTarget there.
>>> 
>>> kind regards
>>> 
>>> Tobias
>>> 
>>>> Am 09.05.2015 um 20:19 schrieb Chris <[email protected]>:
>>>> 
>>>> Hi,
>>>> 
>>>> thanks, I am getting the message "method does not override method from its 
>>>> superclass."
>>>> 
>>>> The problem is that I do not have the callback method in this panel but in 
>>>> its parent; I would need to have a getter method so that I can directly 
>>>> access the resource link from the panel instance and change its visibility.
>>>> 
>>>> ResourceLink pl = new ResourceLink("pdfLink", new 
>>>> ByteArrayResource("application/pdf") {
>>>> 
>>>>         @Override
>>>>         protected boolean isVisible() {
>>>>             return ....;
>>>>         }
>>>> 
>>>>     });
>>>> 
>>>> Chris
>>>> 
>>>> 
>>>>> Am 09.05.2015 um 20:12 schrieb Tobias Soloschenko 
>>>>> <[email protected]>:
>>>>> 
>>>>> Yes - should work because isVisible is inherited from component:
>>>>> 
>>>>> http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/markup/html/link/ResourceLink.html
>>>>> 
>>>>> But watch out not to put in expensive calls in it! The user guide is also 
>>>>> mentioning a lot about that topic:
>>>>> 
>>>>> https://wicket.apache.org/guide/guide/bestpractices.html#bestpractices_5
>>>>> 
>>>>> At this place it is good to mention the new location of the guide:
>>>>> 
>>>>> http://ci.apache.org/projects/wicket/guide/6.x/
>>>>> 
>>>>> http://ci.apache.org/projects/wicket/guide/7.x/
>>>>> 
>>>>> kind regards
>>>>> 
>>>>> Tobias
>>>>> 
>>>>>> Am 09.05.2015 um 19:58 schrieb Chris <[email protected]>:
>>>>>> 
>>>>>> Hi Tobias,
>>>>>> 
>>>>>> thanks! Can the isVisible method be directly overridden also by  a 
>>>>>> ResourceLink?  
>>>>>> 
>>>>>> ResourceLink pl = new ResourceLink(..) {
>>>>>> protected boolean isVisible() {…}
>>>>>> }
>>>>>> Chris
>>>>>> 
>>>>>> 
>>>>>>> Am 09.05.2015 um 19:46 schrieb Tobias Soloschenko 
>>>>>>> <[email protected]>:
>>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> the constructor of your panel is only called at a normal request - you 
>>>>>>> have to set the visibility of your link in the ajax callback via 
>>>>>>> AjaxRequestTarget.
>>>>>>> 
>>>>>>> 1. setOutputMarkupId and setOutputMarkupPlaceholder of the link to true 
>>>>>>> (in your constructor)
>>>>>>> 
>>>>>>> 2. set the visibility to your component in the callback method (based 
>>>>>>> on your Model)
>>>>>>> 
>>>>>>> 3. add the component to the AjaxRequestTarget so that it is updated 
>>>>>>> 
>>>>>>> Another solution would be to override the isVisible method and return 
>>>>>>> the visibility based on your model and then only add the component to 
>>>>>>> the AjaxRequestTarget.
>>>>>>> 
>>>>>>> kind regards
>>>>>>> 
>>>>>>> Tobias
>>>>>>> 
>>>>>>>> Am 09.05.2015 um 19:29 schrieb Chris <[email protected]>:
>>>>>>>> 
>>>>>>>> Hi all,
>>>>>>>> 
>>>>>>>> currently, the visibility of the resource link is not updated when the 
>>>>>>>> parent component of the panel is rendered again based on an ajax call.
>>>>>>>> 
>>>>>>>> How can the visibility set dynamically based on the model’s data?
>>>>>>>> 
>>>>>>>> Thanks, Chris
>>>>>>>> 
>>>>>>>> public SomePanel(String id, final IModel<List<A>> model) {
>>>>>>>> super(id, model);
>>>>>>>> 
>>>>>>>> ResourceLink pl = new ResourceLink("pdfLink", new 
>>>>>>>> ByteArrayResource("application/pdf") {...}
>>>>>>>> pl.setVisible(routingModel.getObject().get(0).getElements().size() > 
>>>>>>>> 0);
>>>>>>>> ...
>>>>>>>> }
>>>>>>>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>>> For additional commands, e-mail: [email protected]
>>>>>>> 
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>> For additional commands, e-mail: [email protected]
>>>>> 
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: [email protected]
>>>>> For additional commands, e-mail: [email protected]
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: [email protected]
>>>> For additional commands, e-mail: [email protected]
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 

Reply via email to