2013-02-01 15 views
6

Ich habe eine Domäne, in dieser Domäne mehr als 25 Mitglieder sind da. Dieser Memberwert stammt aus einem Formular. Aber es fühlt sich schlecht an, diese zu großen Felder zu füllen. Also dachte ich, die Eingabeform in verschiedene Stufen zu teilen.Grails-Service mit verschiedenen Bereichen für die Persistenz

Ich habe eine Klasse namens formobject gemacht, die benötigten Felder für alle Eingänge hat. Das Problem besteht darin, dass es keine Möglichkeit gibt, dieses Objekt zwischen Seiten zu übergeben.

Ich dachte, vielleicht einen Dienst mit dem Umfang der Sitzung erlauben würde, mir einen Verweis auf eine formobject zu halten und rufen Sie einfach eine Methode aus dem Service wieder zu bekommen.

<g:set var="formService" value="${new FormService()}" /> 

class FormService{ 
    static transactional = false 
    static scope = "session" 

    FormObject myObject = new FormObject() 

    def resetForm(){ 
     myObject=new FormObject() 
    } 

    def getForm(){ 
     return myObject 
    } 
} 

und verwendet das in GSP wie

<g:set var="myForm" value="${formService.getForm()}" /> 

jedoch die Daten bestehen nicht zwischen den Seiten.

Es spielt bestehen, wenn ich die myObject Eigenschaft als statisch definieren, aber ich mache mir Sorgen, dass sie bei dieser Produktion trifft, wird die myObject in allen Benutzern gemeinsam genutzt werden.

Kann jemand bestätigen, was passieren würde, wenn ich es statisch gemacht? Würde jede Sitzung ein statisches Formularobjekt haben oder wäre nur ein statisches Formularobjekt vorhanden?

Antwort

2

ich die Lösung bekam ....

Der erste Ansatz ist in der Nähe, mit der Ausnahme, dass Sie eine neue Instanz sind die Schaffung anstatt es als Spring-Bean bekommen, so dass die Tatsache, dass es session-scoped isn‘ t ins Spiel kommen. Wenn Sie Workflows mit mehr als zwei Seiten haben, sollten Sie sich im Allgemeinen WebFlow ansehen, aber das ist möglicherweise eine größere Lösung als Sie benötigen.

würde ich den Service-Wrapper überspringen und speichern nur das Objekt in der Sitzung. Das Risiko besteht darin, dass Sie Ihre Sitzungen mit Objekten verschmutzen können, wenn etwas passiert und Sie sie nicht entfernen, also sollten Sie damit umgehen.

Im ersten Controller-Aktion sicherstellen, dass das Objekt dort:

def action1 = { 
    ... regular work 
    session.formObject = new FormObject() 
    // return model, e.g. 
    [foo: bar] 
} 

und in GSPs können Sie es

${session.formObject} 
+2

Warum antworten Sie Ihre eigene Frage, wie Sie mit einer anderen Person sprechen? lol. – lucke84

+0

@ lucke84, diese Frage wichtig und neu für das Wissen zu Grals Entwickler. – sanghavi7

+0

Es ist eine gute Sache, dass du deine Lösung geteilt hast, ich frage mich nur, warum du nicht einfach gesagt hast "Ich habe es so gelöst" anstatt "Du musst es so machen". – lucke84

1

ich wahrscheinlich Objekt durch die die Form würde einen anderen Ansatz beziehen und liefern Modell über den Controller - alle persistance Probleme auch durch die Steuerung erfolgen würden, so dass Ihr erster Ansatz wird als ...

erwartet funktioniert
function showForm() { 
    render[view: 'view', model: [serviceForm: formService.form]] 
} 

function persistForm(MyCommand cmd) { 
    // check cmd for errors 
    if(cmd.hasErrors()) { 
    // return the MyCommand object for error yielding 
    render(view: 'view', model: [cmd: cmd]] 
    } 
    // persist cmd fields to formService.form object 
    formService.form.field = cmd.field 
} 

dies sollte wie erwartet funktionieren