Question

J'ai mis à jour certains de mes contrôleurs pour utiliser des objets de commande et démarré sur la route de la fabrication d'un paginateCommand pour d'autres objets de commande pour s'étendre.

class PaginateCommand {
    String sort
    String order
    Integer max
    Integer maxsteps
    Integer offset
    Integer total
}

classe de sous-commande

@Validateable
class MyOtherCommand extends PaginateCommand {
    ...    
}

contrôleur

class SomeController {

    def someService

    def index(MyOtherCommand cmd) {
        someService.loadSomeList(cmd)
        return [cmd: cmd]
    }
}

Tout cela fonctionne bien et mes contrôleurs sont maintenant agréables et simples. Le problème est maintenant que la balise de paginate me donne des problèmes. C'est ce que j'ai à l'origine supposé fonctionnerait:

<g:paginate total="${cmd.total}" params="${cmd.properties}" />

Cependant, la balise de paginate ne concerne que les paramètres connectés à la demande de la plupart des valeurs et que celles ne sont pas transmises sur l'attribut Params. Je dois passer manuellement ces variables en tant qu'attributs comme le total est ci-dessus.

Toutes les variables de pagination semblent être supprimées des paramètres de la demande lorsqu'ils sont liés à l'objet de commande (je suppose). Je voudrais garder ces variables dans l'objet de commande afin que je n'ai pas à transmettre les paramètres de la demande à mes services. Avoir le contrôleur repeuplez les paramètres avant que le rendu semble aussi contre-productif.

suis bloqué avoir à remplir tout argument dans la balise de paginate ou y a-t-il une autre façon dont je manque?

<g:paginate total="${cmd.total}" offset="${cmd.offset}" max="${cmd.max}".... /> 

P.s. J'utilise Grails 2.3.6

Était-ce utile?

La solution

merci doelleri.La balise serait suffisamment simple pour mettre en œuvre mais j'ai fini par utiliser l'étiquette de paginate tel quel.En règle générale, seuls 3 attributs sont nécessaires (total, max et décalage), je pensais donc que ce n'était pas un problème assez important pour introduire une nouvelle étiquette personnalisée.L'attribut Params sur la balise de paginate est vraiment conçu pour passer des paramètres de demande de retour pour maintenir l'état des filtres / tri / etc., donc je suppose qu'il est logique que Grails n'utilise pas cela pour remplir les autres attributs de la balise.

J'ai fini par ajuster ma classe de commande de paginate car la sous-classe avait des collections et d'autres propriétés qui ont encombré inutilement les paramètres de la demande.C'est ce que j'ai fini par faire.

abstract class PaginateCommand {
    String sort
    String order
    Integer max
    Integer maxsteps
    Integer offset
    Integer total

    // Properties needed to maintain pagination state
    abstract Map getFilterParams();

    public Map getPaginateParams() {
        return [sort:sort, order:order] << filterParams
    }
}

sous-commande

@Validateable
class MyOtherCommand extends PaginateCommand {    
    String filter1
    String filter2
    List data

    public MyOtherCommand() {
        max = 50
        sort = "id"
        order = "desc"
    }

    Map getFilterParams() {
        [filter1: filter1, filter2: filter2]
    }
    ...
}

contrôleur

def index(MyOtherCommand cmd) {
    someService.loadData(cmd)
    return [cmd: cmd]
}

et dans le SGSP

<g:paginate total="${cmd.total}" max="${cmd.max}" maxsteps="${cmd.maxsteps}" offset="${cmd.offset}" params="${cmd.paginateParams}" />

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top