2014-06-05 13 views
5

Làm cách nào để trả về các giá trị từ thẻ taglib đã được gọi trong hành động điều khiển sao cho nó tự động giữ lại cấu trúc kiểu đầy đủ của các thiết lập giá trị trong thẻ taglib?Grails: Trả về các tham số từ một thẻ tag

Tôi có thể sử dụng cách tiếp cận out << nhưng điều này trả về chuỗi hoặc chuỗi chuỗi.

Tôi đã cố gắng sử dụng ánh xạ [] khi sử dụng chuyển một tập hợp các giá trị ở cuối hành động cho chế độ xem của nó.

Tôi cũng đã cố gắng tuyên bố lại return không thành công - ngoài ra tôi cần trả về nhiều bộ giá trị.

-mike

+1

'returnObjectForTags' có thể hoạt động nhưng tùy thuộc vào những gì bạn đang thực sự cố gắng làm điều đó có thể là một thẻ lib là điều sai hoàn toàn ở đây. Bạn có thể mô tả bạn đang làm gì với thẻ lib không? –

+0

Tôi đã cố gắng sử dụng thẻ returnObjectForTags với thẻ - nhưng không thể hoạt động. Có lẽ một dịch vụ là một lựa chọn tốt hơn. Đây là taglib: – mikek

+0

Nó không thực sự rõ ràng những gì bạn đang cố gắng làm nhưng không có gì trong mô tả của bạn cho thấy rằng một thẻ lib có ý nghĩa. –

Trả lời

6

từ phía trên cùng của tài liệu http://grails.org/doc/latest/guide/theWebLayer.html#tagReturnValue

class ObjectReturningTagLib { 

    static returnObjectForTags = ['content'] 

    def content = { attrs, body -> 
    someValue() 
    } 
} 
+0

Tôi đang cố gắng trả về một ArrayList của các trường hợp được chọn của một mô hình miền và cũng là kích thước của mảng. Tôi đang sử dụng một taglib để modularize một số mã đã thành công tạo ra ArrayList này trong một bộ điều khiển/hành động. – mikek

+1

Điều đó nghe có vẻ như có thể có trong Dịch vụ. –

+0

@Scott Có lẽ một dịch vụ là một lựa chọn tốt hơn - không chắc chắn về sự khác biệt với một taglib. Taglib có một chuỗi các cuộc gọi .where 'đến dB. Tôi đã phải viết tắt những điều dưới đây. Giá trị trả về là một ArrayList của trường PublishedShr mà tôi truyền lại cho một cái nhìn từ hành động: '\t def getPubVidList = {attrs, cơ thể-> \t \t def currOrganId = attrs [ "visitorOrgan"] \t \t def queryMKP = PublishedShr .where { \t \t \t videoid trong pubMkLstV \t \t} \t \t def pubMkLstP = queryMKP.list() \t \t def pubMkLstTotal = queryMKP.count() \t \t return pubMkLstP } // end getPubVidList' – mikek

0

Tôi nghĩ rằng điều này có thể giải quyết vấn đề của bạn

package com.campaign 
import java.util.*; 
class UserDetailsTagLib { 
def springSecurityService 
static namespace = "jft" 
#here we are defining that this getPrincipal and getArrayListAsObj tag used to return  object 
static returnObjectForTags = ['getPrincipal','getArrayListAsObj'] 
#this tag will return obj 
def getPrincipal = { 
    return springSecurityService.principal 
} 
# this tag is used to return the array list of string 
def getArrayListAsObj = { attrs , body -> 
    ArrayList arrayList = new ArrayList(); 
    arrayList.add("C"); 
    arrayList.add("A"); 
    arrayList.add("E"); 
    arrayList.add("B"); 
    arrayList.add("D"); 
    arrayList.add("F"); 

    return arrayList 

} 

}

+0

Tôi đã thử ở trên nhưng vẫn nhận được một danh sách chuỗi được trả về từ thẻ taglib. Đây là cuộc gọi trong bộ điều khiển: 'def pubMkLstP = getPubVidList (visitorOrgan: currOrganId)' Không chắc chắn liệu bạn có định đưa tôi vào phiên bản của thẻ getLConfigData thứ hai hay không - tôi đã thêm phiên bản đã sửa đổi mà không thành công: '\t def getAppConfigData = { attrs, cơ thể -> \t \t ra << (. pubMkLstP.appConfig.configData "$ {attrs.key}") ?. encodeAsHTML() \t} '. thay thế giá trị chính bằng giá trị của tôi. Bất kỳ trợ giúp sẽ được đánh giá cao? – mikek

+0

trong câu trả lời ở trên, tôi đã khai báo hai thẻ. đầu tiên là getPricipal được sử dụng để lấy đối tượng chính từ phiên và đối tượng trả về. và thẻ thứ hai là getAppConfighData là một thẻ khác và nó không trả về nó chỉ ghi giá trị k đã cho trong phản hồi. –

+0

Tôi hiện đang tạo ArrayList trong thẻ taglib - một mảng các cá thể mô hình. Khi tôi trả lại nó cho bộ điều khiển/hành động, nó không truyền nó một cách chính xác. Cố gắng in ArrayList trong hành động tôi nhận được lỗi "Không có chữ ký của phương thức (SLF4JLog)". Nó đã trả về thành công ArrayList nhưng dưới dạng danh sách các chuỗi. Sự trở lại: 'trở pLst' Cuộc gọi là:' def pLst = getPubVidList (visitorOrgan: currOrganId) ' Tôi đã thêm getAppConfigData không chắc chắn những gì tôi đang làm trong sự thật - dòng ra là:' ra < <(pLst.appConfig.configData. "$ {attrs.key}") ?. encodeAsHTML() ' -mike – mikek

0

Tôi hiểu vấn đề của bạn. Nếu bạn muốn có Intellisense trên var bạn nhận được từ một taglib, điều duy nhất bạn có thể có là này (nó hơi dư thừa)

Ví dụ: nếu bạn có một TagLib với không gian tên myTaglib:

cuộc gọi đầu tiên hoạt động của taglib của bạn để thiết lập giá trị của một var:

<myTaglib:person var="currentUserFromTaglib" /> 

Trường hợp person thẻ trong myTaglib chỉ dành cho mục đích này:

def person = { attrs -> 
     this.pageScope."$attrs.var" = new Person(name:'Giuseppe', surname:'Iacobucci') 
    } 

Sau đó, bạn cần phải viết:

<g:set var="currentUser" value="${currentUserFromTaglib as Person}"/> 

Và bao gồm trong bạn GSP:

<%@ page import="your.package.Person" %> 

Sau đó, trong GSP currentUser được công nhận là loại Person.

Trong một bộ điều khiển, bạn chỉ cần gọi myTaglib và đúc kết quả như sau:

def myvar = myTaglib.person() as Person 

Rõ ràng nếu bạn cần thêm một đối tượng phức tạp như tôi đọc từ bình luận của bạn, sau đó tạo ra một đối tượng giao diện người dùng đơn giản với tất cả thông tin bạn cần bên trong và thực hiện thủ thuật tương tự.

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