2015-05-13 11 views
6

Ho iniziato a studiare il framework Wicket e mi sono imbattuto in modelli wicket e ho letto su Model(), CompouneModel() e CompoundPropertyModel() ma non ho avuto la reale differenza tra loro. Ho cercato su Google per questo, ma non ho ricevuto alcuna informazione al riguardo.Qual è la differenza tra Model, PropertyModel e CompoundPropertyModel in Wicket?

Questo link fornisce una descrizione tra CompoundPropertyModel e PropertyModel ma non è ancora chiaro per la differenza.

Solo la cosa che potevo distinguere tra il Modello e gli altri due è che il modello non può funzionare con i campi dinamici mentre altri due possono.

Qualcuno può, per favore, dare la differenza tra questi modelli?

risposta

9

Tutti sono implementazioni dell'interfaccia IModel.

Classe modello è un'implementazione di base, che è quasi solo un 'Titolare del trattamento' in modo da poter memorizzare un oggetto in quel modello e ottenere. Il valore aggiunto di questa classe è di inoltrare per ottenere e impostare l'oggetto modello se l'oggetto memorizzato è un altro modello (IModel).

Classe PropertyModel è utile se si desidera ottenere/per impostare una proprietà utilizzando l'espressione di proprietà. Vedere un esempio:

class Data { 

    private Integer data; 
    private String name; 

    /* getters and setters */ 

} 

Come ottenere e impostare i dati utilizzando il PropertyModel:

Data data = new Data(); 
data.setId(1); 
data.setName("data entity"); 
IModel idModel = new PropertyModel(data, "id"); 
IModel nameModel = new PropertyModel(data, "name"); 

System.out.println(data.getId()); 
// prints '1' 
System.out.println(idModel.getObject()); 
// prints '1' 
System.out.println(data.getName); 
// prints 'data entity' 
System.out.println(nameModel.getObject()); 
// prints 'data entity' 


data.setId(2); 
nameModel.setObject("a new name"); 

System.out.println(data.getId()); 
// prints '2' 
System.out.println(idModel.getObject()); 
// prints '2' 
System.out.println(data.getName()); 
// prints 'a new name' 
System.out.println(nameModel.getObject()); 
// prints 'a new name' 

Classe CompoundPropertyModel è utile se si desidera propage proprietà ai componenti da loro ID. Vedere un esempio (utilizzando la stessa classe di dati):

Java Code (MyPanel.java):

class MyPanel extends Panel { 

    public MyPanel(IModel<Data> model) { 
     super(new CompoundPropertyModel<Data>(model)); 
     add(new Label("id")); 
     add(new Label("data")); 
    } 
} 

Markup (MyPanel.html):

<wicket:panel> 
    <span wicket:id="id">placeholer for id</span> 
    <span wicket:id="name">placeholer for id</span> 
</wicket:panel> 

Java Codice che utilizza MyClass:

// in a Page, Panel or an other Component 
Data data = new Data(); 
data.setId(3); 
data.setName('my name'); 
add(new MyPanel(Model.of(data))); 

HTML output di rendering (dalla centrale):

<span>3</span> 
<span>my name</span>