2010-11-22 26 views
1

Cela peut sembler très bizarre, mais commençons par un exemple:Est-il possible d'obtenir la valeur du champ ui: dans le code java dans GWT?

<my:MagicWidget ui:field="someFieldName" fieldName="someFieldName"/> 

Il est à peu près asured que nous voulons toujours avoir la même valeur dans ui champ et fieldName. Clairement, il y a de la duplication dans ce code, j'aimerais l'éviter et rendre le fieldName optionnel.

Alors, voici ce que j'ai dans le code du widget:

@UiConstructor 
public MagicWidget(String fieldName) { 
    this.fieldName = fieldName; 
} 

Mais je voudrais, si possible pour permettre à ce constructeur d'être en option, et fournir un constructeur par défaut qui « par magie » découvrir que c'est ui: valeur du champ:

@UiConstructor 
public MagicWidget() { 
    this.fieldName = /*some magic to get ui:field's value*/; 
} 

Je me demandais s'il y a un moyen d'obtenir la valeur de « ui: champ » dans mon MagickWidget? (Le widget s'étend Composite). Je crains que cela ne soit pas possible, parce que la plupart du temps ce n'est pas très utile, mais si quelqu'un a une idée - n'hésitez pas à partager! PS: j'utilise GWT 2.1.0.RC1.

+0

Pourriez-vous nous dire ce que vous essayez d'accomplir? Comme dit par @RPeden l'attribut 'ui: field' est utilisé pour accéder au widget dans votre classe' MagicWidget' en annotant un champ avec '@ UiField'. – z00bs

Répondre

1

Comme vous le savez, le champ ui: est là pour que vous puissiez interagir avec un objet UI dans le code Java après l'avoir déclaré avec UiBinder. Ainsi, par exemple, si vous ajoutez un MagicWidget dans un modèle UiBinder, vous pouvez écrire

@UiField MagicWidget someWidget

afin de pouvoir interagir avec programatically. Avoir votre widget magique au courant du nom de la référence qui pointe dessus peut ne pas être très utile (ou possible), car vous pouvez passer la référence à ce MagicWidget spécifique entre différentes parties de votre application. Un seul MagicWidget pourrait facilement avoir plusieurs références avec des noms différents pointant sur est simultanément. C'est pourquoi il est difficile de le choisir "par magie" à l'exécution. Je me rends compte que ce n'est pas vraiment un problème si vous voulez seulement cette valeur quand l'objet est construit, mais gardez à l'esprit que vous n'êtes pas obligé d'inclure un champ ui: lorsque vous ajoutez un widget en utilisant UiBinder.

Pourquoi est-il important que le widget connaisse son nom de champ? En sachant cela, il pourrait être plus facile de fournir des suggestions sur d'autres façons d'accomplir ce que vous cherchez à faire.

+0

Ce que je voulais faire, c'est simplement supprimer la duplication du fichier XML d'uiBinder. Comme nous avons beaucoup de champs où nous déclarons le même nom dans deux paramètres, une fois pour la vue de lier id propperly et une fois pour que le widget soit construit comme indiqué ci-dessus - vous pouvez penser à un "formulaire", mais où faire des trucs de fantaisie (c'est le MagicWidget (le nom est bien sûr fait ici ;-)). Mais après un peu de piratage, il s'est avéré tout à fait impossible d'éviter cette duplication - pas que ce soit un gros problème, je faisais juste du piratage ... :-) Quoi qu'il en soit, merci pour votre réponse! –

+0

Il n'y a pas d'annotation @ @ UiBinder. Peut-être que ce devrait être '@ UiField'? –

+0

Je l'ai fait, Brad. J'ai corrigé l'erreur. Même s'il s'agit d'un ancien post, il pourrait toujours être utile à quelqu'un. – RPeden