Magento 2: ce qui remplit les «elems» dans un composant d'interface utilisateur

9

Le modèle KnockoutJS de niveau supérieur de la liste des composants d'interface utilisateur ressemble à ceci

<!-- File: vendor/magento//module-ui/view/base/web/templates/collection.html -->

<each args="data: elems, as: 'element'">
    <render if="hasTemplate()"/>
</each>

Ceci est traduit par Magento dans le code KnockoutJS brut suivant.

<!-- ko foreach: {data: elems, as: 'element'} -->
    <!-- ko if: hasTemplate() --><!-- ko template: getTemplate() --><!-- /ko --><!-- /ko -->
<!-- /ko -->

Dans les deux cas, ce modèle foreachsurvolera la elemspropriété du modèle de vue .

Si je regarde le module RequireJS qui (je pense>) renvoie la classe constructeur du modèle de vue

vendor/magento/module-ui/view/base/web/js/lib/core/collection.js

Je vois que la insertChildméthode semble s'ajouter à la elemspropriété.

Ce qui est moins clair pour moi est: où Magento appelle-t-il réellement insertChildpour remplir le elemset / ou comment est-il elemsrempli avec les modèles de vue qui composent une collection de composants d'interface utilisateur?

Alan Storm
la source

Réponses:

2

La seule information que je peux trouver est

registry.get(component.parentName).insertChild(component, val.value);

à la ligne 321 du

vendor/magento/module-ui/view/base/web/js/core/renderer/layout.js

Il semble que ce soit à l'intérieur d'une fonction qui fusionne les composants?

merge: function (components) {
   ...
}

Ceci est utilisé sur la ligne 73 (fonction run) du même fichier (layout.js) où il est utilisé pour fusionner les nœuds.

function run(nodes, parent, cached, merge) {
    if (_.isBoolean(merge) && merge) {
        layout.merge(nodes);

        return false;
    }

    if (cached) {
        cachedConfig[_.keys(nodes)[0]] = JSON.parse(JSON.stringify(nodes));
    }

    _.each(nodes || [], layout.iterator.bind(layout, parent));
}

Ces fonctions d'exécution sont utilisées dans 2 fonctions (processus et fusion - les deux dedans layout.js) mais je ne peux pas comprendre complètement ce qu'elles font.

Mise à jour

Je viens de voir ce qui suit dans les documents de développement - http://devdocs.magento.com/guides/v2.1/ui_comp_guide/concepts/ui_comp_uicollection_concept.html

elems est la propriété observable qui contient la collection de composants d'interface utilisateur enfants.

elems est la collection des éléments enfants de uiCollection. Dans la mesure où elems est la propriété observable, les modèles des composants ajoutés aux elems dans le runtime sont également rendus

Ben Crook
la source