web-dev-qa-db-fra.com

Comment accéder aux éléments à partir d'un fragment XML par ID

Je travaille sur une application SAPUI5. J'ai une vue XML qui contient un XML Fragment et un bouton pour enregistrer.

Le fragment contient quelques contrôles comme une liste déroulante, un champ de texte et un tableau. Lorsque j'appuie sur le bouton Enregistrer, j'ai besoin d'obtenir toutes les lignes du tableau et d'appeler un service de mise à jour OData.

Le problème est dans la méthode onSave dans le contrôleur de vue. J'obtiens une erreur lors de l'accès à la table en utilisant son ID. Quelqu'un peut-il m'aider et me conseiller sur la façon d'accéder aux contrôles utilisés dans les fragments par leur ID dans le contrôleur?

Voici l'extrait de code:

---- Vue

<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns:core="sap.ui.core" xmlns:form="sap.ui.layout.form" xmlns="sap.m">
  <Page>
    ...
    <form:SimpleForm>
      <core:Fragment id ="fr1" fragmentName="first" type="XML"/>
      <Button id="id1" press="onSave"/>
    </form:SimpleForm>
  </Page>
</mvc:View>

---- Définition du fragment

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core">
  <Table id="tab1" mode="MultiSelect">
    ...
  </Table>
</core:FragmentDefinition>

---- Manette

sap.ui.controller("view", {
  onSave: function() {
    //var tab = this.getView().byId("tab1"); // Not working
    var tab  = sap.ui.getCore().byId("tab1"); // Not working
  },
  // ...
});
11
Nilesh Puranik

En regardant le code openui5 sur github, il semble que le fragment délègue la génération d'ID local à la vue conteneur si le <Fragment/> Lui-même ne le fait pas pas avoir un identifiant explicite.

Votre code this.getView().byId("tab1") devrait donc fonctionner dès que vous supprimez l'attribut id="fr1" De votre élément <Fragment/>.

Lorsque vous utilisez des identifiants explicites, il existe une méthode statique Fragment.byId () pour récupérer le contrôle. Je suppose que vous devez l'utiliser comme ceci:

var fragmentId = this.getView().createId("fr1");
var tab = sap.ui.core.Fragment.byId(fragmentId, "tab1");
17
schnoedel

L'accès aux contrôles à l'intérieur d'un fragment dépend de la façon dont votre fragment a été créé en premier lieu. Voici une liste de cas avec l'API respective à utiliser pour obtenir la référence de contrôle:

API à utiliser

this.byId("controlId");
  • Lorsque le fragment a été créé avec un ID de vue:

    sap.ui.xmlfragment(this.getView().getId(), "my.Fragment", this); // deprecated *
    <core:Fragment fragmentName="my.Fragment" type="XML" />
    <!-- View ID will be automatically propagated in XMLView -->
  • ID global: "componentId---viewId--controlId" **

this.byId(Fragment.createId("fragmentId", "controlId"));
  • Lorsque voir ID et un ID de fragment ont été donnés:

    sap.ui.xmlfragment(this.createId("fragmentId"), "my.Fragment", this); // deprecated *
    <core:Fragment id="fragmentId" fragmentName="my.Fragment" type="XML"/>
  • ID global: "componentId---viewId--fragmentId--controlId" **

Fragment.byId("fragmentId", "controlId");
  • Lorsque ID de fragment uniquement:

    sap.ui.xmlfragment("fragmentId", "my.Fragment", this); // deprecated *
  • ID global: "fragmentId--controlId"

sap.ui.getCore().byId("controlId");
  • Lorsqu'aucune pièce d'identité n'a été donnée:

    sap.ui.xmlfragment("my.Fragment", this); // deprecated *
    // All control IDs within the fragment gets registered globally without any prefixes!!
    
  • ID global: "controlId"


*: L'API sap.ui.*fragment Est déconseillée. Utilisez Fragment.load à la place (disponible depuis 1.58).

**: L'ID du composant ne fera pas partie de l'ID global si aucun ID stable n'a été donné pour la vue. Dans ce cas, l'ID global commence par l'ID de vue généré: "__xmlview0--...".


Donné

  • this: référence à l'instance de contrôleur
  • Fragment: Nom du paramètre du module résolu donné par la définition de dépendance

    sap.ui.define([ // or .require
      "sap/ui/core/Fragment",
      // ...
    ], function(Fragment, /*...*/) { /*...*/});
    

Remarque

  • Évitez de concaténer des parties d'ID ou de vous fier à la syntaxe de l'ID global, comme mentionné dans le commentaire ainsi que dans le documentation :

    Ne pas compter sur la syntaxe de préfixe spécifique car elle peut changer à un moment donné. Utilisez toujours des méthodes comme byId() et createId().

  • Considérez pour éviter d'utiliser les API ci-dessus lorsque l'intention est réellement de modifier certaines données qui sont utilisées dans les contrôles de fragment (par exemple myManuallyAccessedInput.setValue("...")). Utilisez plutôt liaison de données ⇒ Les changements de modèle seront automatiquement reflétés dans l'interface utilisateur.
19
Boghyon Hoffmann

Pour le faire fonctionner sans ID de fragment explicite et sans Fragment.byId () statique, j'ai utilisé l'extrait de code suivant:

var prefix = this.getView().createId("").replace("--", "");
var fragment = sap.ui.xmlfragment(prefix, "-- XML fragment name --", this);

après cela, vous pouvez utiliser this.getView (). byId ("tab1") comme avec tout autre contrôle.

2
slkorolev