2013-02-01 37 views
6

Tôi có một miền, trong miền đó có hơn 25 thành viên ở đó. Giá trị thành viên này sẽ đến từ một biểu mẫu. Nhưng nó cảm thấy xấu để điền vào những lĩnh vực quá nhiều. Vì vậy, tôi nghĩ rằng chia hình thức đầu vào thành các giai đoạn khác nhau.dịch vụ grails với các phạm vi khác nhau cho sự kiên trì

Tôi đã tạo một lớp có tên FormObject có các trường cho TẤT CẢ đầu vào cần thiết. Vấn đề là không có cách nào để vượt qua đối tượng này giữa các trang.

Tôi đã nghĩ có thể một dịch vụ có phạm vi phiên sẽ cho phép tôi giữ tham chiếu đến FormObject và chỉ cần gọi phương thức từ dịch vụ để nhận lại.

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

và sử dụng đó vào GSP như

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

Tuy nhiên, dữ liệu không tồn tại giữa các trang.

Nó vẫn tồn tại nếu tôi xác định thuộc tính myObject là tĩnh, nhưng tôi lo lắng rằng khi lần truy cập này được sản xuất, myObject sẽ được chia sẻ trên tất cả người dùng.

Có ai có thể xác nhận điều gì sẽ xảy ra nếu tôi đặt quảng cáo tĩnh không? Mỗi phiên có một đối tượng dạng tĩnh hay chỉ có một đối tượng dạng tĩnh?

Trả lời

2

tôi có những giải pháp ....

Phương pháp đầu tiên là đóng cửa, ngoại trừ việc bạn đang tạo một trường mới thay vì nhận nó như là một đậu mùa xuân, vì vậy thực tế là nó là phạm vi phiên isn' t vào chơi. Nói chung nếu bạn có quy trình làm việc kéo dài hơn hai trang, bạn nên xem xét WebFlow, nhưng đó có thể là giải pháp lớn hơn bạn cần.

Tôi sẽ bỏ qua trình bao bọc dịch vụ và chỉ lưu trữ đối tượng trong phiên. Nguy cơ ở đây là bạn có thể kết thúc làm ô nhiễm các phiên của bạn với các đối tượng nếu có điều gì đó xảy ra và bạn không loại bỏ chúng, vì vậy bạn nên xử lý điều đó.

Trong controller action trước tiên hãy chắc chắn rằng các đối tượng là có:

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

và trong GSP bạn có thể tham khảo nó

${session.formObject} 
+2

Tại sao bạn trả lời câu hỏi của riêng mình như khi bạn đang nói chuyện với người khác? lol. – lucke84

+0

@ lucke84, câu hỏi này quan trọng và mới mẻ đối với kiến ​​thức đối với nhà phát triển grails. – sanghavi7

+0

Đó là một điều tốt khi bạn chia sẻ giải pháp của mình, tôi chỉ tự hỏi tại sao bạn không chỉ nói "Tôi đã giải quyết nó theo cách này" thay vì "Bạn phải làm theo cách này". – lucke84

1

tôi có lẽ sẽ có cách tiếp cận khác và cung cấp các đối tượng hình thức thông qua việc mô hình thông qua bộ điều khiển - tất cả các vấn đề liên tục cũng sẽ được thực hiện thông qua bộ điều khiển, do đó cách tiếp cận đầu tiên của bạn sẽ hoạt động như mong đợi ...

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 
} 

điều này sẽ hoạt động như mong đợi

Các vấn đề liên quan