2013-02-01 22 views
6

Mam jedną domenę, w tej domenie jest więcej niż 25 członków. Ta wartość członków będzie pochodzić z jednego formularza. Ale źle jest wypełnić te zbyt duże pola. Tak więc pomyślałem, że dzieląc formularz wejściowy na różne etapy.usługa grails z różnymi zakresami dla trwałości

Zrobiłem klasę o nazwie FormObject, która ma pola dla WSZYSTKICH potrzebnych danych wejściowych. Problem polega na tym, że nie można przekazać tego obiektu między strony.

Myślałem, że może serwis z zakresem sesji pozwoli mi zachować odniesienie do obiektu FormObject i po prostu wywołać metodę z usługi, aby uzyskać ją ponownie.

<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 
    } 
} 

i używane to pod GSP jak

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

Jednak dane nie utrzymują między stronami.

Trwa, jeśli zdefiniuję właściwość myObject jako statyczną, ale obawiam się, że kiedy to nastąpi, myObject zostanie udostępniony wszystkim użytkownikom.

Czy ktoś może potwierdzić, co by się stało, gdybym zrobił to statycznie? Czy każda sesja ma obiekt w formie statycznej, czy może istnieć tylko jeden obiekt formularza statycznego?

Odpowiedz

2

mam rozwiązanie ....

Pierwsze podejście jest bliskie, chyba że tworzysz nową instancję zamiast się go jak sprężyna fasoli, więc fakt, że to sesja o zasięgu ISN” t wchodzi w grę. Ogólnie rzecz biorąc, jeśli masz przepływy pracy obejmujące więcej niż dwie strony, powinieneś spojrzeć na WebFlow, ale może to być większe rozwiązanie, niż potrzebujesz.

Chciałbym pominąć opakowanie usługi i po prostu przechowywać obiekt w sesji. Ryzykiem jest to, że możesz zanieczyścić sesje obiektami, jeśli coś się stanie i ich nie usuniesz, więc powinieneś sobie z tym poradzić.

W pierwszej akcji kontrolera upewnij się, że obiekt jest tam:

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

aw GSPs można przekazać ją

${session.formObject} 
+2

Dlaczego odpowiadasz na własne pytanie, tak jak rozmawiasz z inną osobą? lol. – lucke84

+0

@ lucke84, to pytanie ważne i nowe dla deweloperów wiedzy dla grails. – sanghavi7

+0

Dobrze, że podzieliłeś się swoim rozwiązaniem, po prostu zastanawiam się, dlaczego nie powiedziałeś "Rozwiązałem to w ten sposób" zamiast "Musisz to zrobić w ten sposób". – lucke84

1

pewnie zajęłoby innego podejścia i dostarczyć obiekt formularza poprzez model za pośrednictwem kontrolera - wszystkie problemy z utrzymaniem będą również wykonywane przez kontroler, aby Twoje pierwsze podejście działało zgodnie z oczekiwaniami ...

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 
} 

powinno działać zgodnie z oczekiwaniami.