12
votes

Utiliser obtenir des éditeurs avec un cas d'utilisation complexe

J'essaie de créer une page très similaire à la page de création de formulaire Google.

Entrée. Image Description Ici P>

C'est ainsi que je tente de le modéliser à l'aide du cadre GWT MVP (lieux et activités) et éditeurs. P>

CreativeEformactivity strong> (Activité et présentateur) p>

CreateEformview fort> (interface pour la vue, avec une interface de présentatrice imbriquée) p>

CreateEformViewImpl STRY> p>

CreateEformviewimpl a les sous-éditeurs suivants: P>


1 commentaires

Vous ajoutez essentiellement deux éditeurs à la chaîne de l'éditeur pour la même valeur. Premièrement, l'éditeur principal est joint, puis le sous-éditeur. Avez-vous essayé de détacher l'éditeur principal avant de joindre le sous-éditeur?


4 Réponses :


9
votes

Fondamentalement, vous voulez un compositeeditor pour gérer les cas où des objets sont ajoutés de manière dynamique ou supprimée de la hiérarchie de l'éditeur. Le indiqué par et facultatiffieditor Adaptateurs Implémente CompositeAditor .

Si les informations requises pour les différents types de questions sont fondamentalement orthogonales, alors multiples facultatiffieditor pourrait être utilisé avec différents champs, un pour chaque type de questions. Cela fonctionnera lorsque vous n'avez que quelques types de questions, mais ne feront pas beaucoup d'échelle à l'avenir.

Une approche différente, qui permettra de mieux utiliser une implémentation personnalisée d'un compositeAditor + LeafValueeditor qui gère un "code> PolyMorphe QuestionData Hiérarchie de type. L'élément UI de type déroulant deviendrait un détail de mise en œuvre du compositeAditor . Lorsqu'un type de question est sélectionné, l'éditeur appellera EditorChain.attach () avec une instance d'un QuestionData Sous-type et le sous-éditeur spécifique de type. La nouvelle instance QUESTMEDATA doit être conservée pour mettre en œuvre LeafValueeditor.getvalue () . La mise en œuvre de compositeeditor.setvalue () crée simplement le sous-éditeur et les appels spécifiques au type éditeur.attach () . .

fwiw, facultatiffietoritor peut être utilisé avec répertoriétor ou tout autre type d'éditeur.


9 commentaires

Merci pour la réponse! Cette approche semble beaucoup plus propre. Je vais essayer d'essayer de poster mes résultats aujourd'hui.


Que devrait être retourné pour compositeeditor.CreateedortorTraversal ()?


La seule chose qui appelle créeeeDeTorTorTraversal () est le pathcollector utilisé par requierFactoryeditordRiver.getpaths () . Ma recommandation consiste à toujours retourner une instance triviale de votre éditeur de type de questions et sachez que vous devrez peut-être modifier la valeur renvoyée par getPaths () .


À chargez Data pour un sous-type spécifique de QuestionData , le chemin spécifique au sous-type doit être ajouté à la requête .with () , mais le < Code> QuestionData Le type n'est pas saisi tant que les données sont chargées. Donc, si tous les chemins possibles des questionnaires-sous-types peuvent être ajoutés lors du chargement de données?


Ajout de tous les sous-chemins possibles dans le avec () appelera rien sur le serveur; Il ignorera les chemins qui n'existent pas dans un objet. Cela ressemble à une demande de fonctionnalité permettant à un avec ("foo. *") Syntaxe pour éviter la nécessité de spécifier des champs sur les cas de retour polymorphe.


Merci! Demande de fonctionnalité créée code.google.com/p/google -Web-Toolkit / Problèmes / Détails? ID = 6698


Hey Bob, je l'ai presque travaillé, voyez-vous ce que je fais mal?


Le générateur GWT ne prend pas en charge les types d'éditeur polymorphes (je pensais que cela avait été fait). Au lieu de cela, vous pouvez créer une interface SimpleBeaneDitordRiver distincte pour chaque sous-type d'éditeur mappé et gérer le cycle EDIT () du sous-pilote () basé sur les appels à l'éditeur de fan de sortie. Dépôt d'un numéro séparé 6719 pour le polymorphisme de l'éditeur.


@Bobv J'aimerais avoir vu ce commentaire avant ma réponse ci-dessous, mais il a été plié par Stackoverflow;) Merci d'avoir déposé le problème.



1
votes

En ce qui concerne votre question Pourquoi les données spécifiques au sous-type ne sont pas affichées ni rinçues:

Mon scénario est un peu différent mais j'ai fait l'observation suivante:

Editeur GWT Datailding ne fonctionne pas comme on le ferait Attendez-vous avec des éditeurs abstraits dans la hiérarchie de l'éditeur. Le sous-assistateur déclaré dans votre questionnaire est de type Questrebasedaeditor et c'est un type entièrement abstrait (une interface). Lorsque vous recherchez des champs / sous-éditeurs pour remplir avec Data / Flush GWT prend tous les champs déclarés dans ce type. Étant donné que le questionnaire n'a aucun sous-éditeur n'a déclaré que rien n'est affiché / rincé. Du débogage que j'ai découvert que cela se produit dû à GWT à l'aide d'un Editordélégate généré pour ce type d'abstrait plutôt que de EditionDélégate pour le sous-type de béton présent à ce moment-là.

Dans mon cas, tous les sous-éditeurs concrets avaient la même chose Types de rédacteurs de la valeur de la feuille (j'avais deux éditeurs de béton différents à afficher et à éditer le même type de haricot) afin que je puisse faire quelque chose comme ça pour contourner cette limitation: xxx < p> maintenant GWT trouve les sous-déclarants de la classe de base abstraite et dans les deux cas, je reçois le nom de champs correspondant et une description de champs et de rinçages remplis et rincé.

Malheureusement, cette approche ne convient pas lorsque les sous -iteurs concrets ont des valeurs différentes dans votre Structure de haricots à éditer: (

Je pense que c'est un bogue du cadre des éditeurs GWT génération de code GWT, qui ne peut être résolu que par l'équipe de développement GWT.


2 commentaires

Une addition: peut-être que cela fonctionnera également pour les sous-politiseurs qui éditeront différents types de haricots, mais la classe de base abstraite / interface doit avoir des champs de rédaction / getters pour toutes les propriétés en question de tous les types qui ne quittent pas ces null qui ne sont pas utilisés par le béton actuel. Sous-classe de l'éditeur.


Avez-vous essayé d'utiliser différentes annotations @Path sur vos sous-éditeurs? Je préfère définitivement l'approche consistant à laisser les éditeurs GWT se lier aux interfaces et aux méthodes (au lieu de classes et de champs)



2
votes

Nous avons mis en place une approche similaire (voir réponse acceptée) et cela fonctionne pour nous comme ceci.

Le pilote étant initialement inconscient des simples chemins de rédaction pouvant être utilisés par des sous-éditeurs, chaque sous-éditeur contient son propre pilote:

        @Path("")
        DynamicEditor<ProductProxy> productDetailsEditor;
        ...
        public void setProductType(ProductType type){
            if (ProductType.VIRTUAL==type){
                productDetailsEditor = DynamicEditor.of(new VirtualProductEditor());

            } else if (ProductType.PHYSICAL==type){
                productDetailsEditor = DynamicEditor.of(new PhysicalProductEditor());
            }
        }


2 commentaires

Votre approche est définitivement valable. Nous avons fait quelque chose de similaire à partir de nos éditeurs - créant un nouveau pilote pour chaque sous-éditeur et les lier ensemble. Je n'aime plus cette approche parce que je suis tombé amoureux des visiteurs de l'éditeur et le pouvoir qu'ils apportent. Par exemple; détection sale. Au lieu de cela, je pense que vous pouvez accomplir la même tâche en utilisant un ensemble d'éditeurs composites.


Une bonne mise en œuvre de la suggestion dans Ce commentaire



0
votes

n'est-ce pas le problème fondamental que la liaison se passe à la compilation de la compilation que ne se lierra que pour les interrogations afin de ne pas avoir de liaisons spécifiques à sous-type? Le compositeAditor Javadoc dit "une interface qui indique qu'un éditeur donné est composé d'un nombre inconnu de sous-éditeurs tout le même type" afin que cela règle cette utilisation?

À mon travail actuel, je pousse tout à fait d'éviter le polymorphisme car le SGBDM ne le supporte pas non plus. Malheureusement, nous en avons pour le moment, donc j'éprime une classe d'enveloppe factice qui expose tous les sous-types avec des getters spécifiques afin que le compilateur ait quelque chose à travailler. Pas jolie cependant.

Avez-vous vu ce message: http://markmail.org/message/u2cff3mfbiboeejr Cela semble les droites.

Je suis un peu inquiet pour le code de code cependant.

espère que cela fait une sorte de sens!


0 commentaires