Magento 2: lo que puebla "elems" en un componente de la interfaz de usuario

9

La plantilla de nivel superior KnockoutJS del listado de componentes de IU se ve así

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

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

Esto es traducido por Magento al siguiente código bruto KnockoutJS.

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

En cualquier caso, esta plantilla foreachsobrepasará la elemspropiedad del modelo de vista .

Si miro el módulo RequireJS que (creo>) devuelve la clase de constructor del modelo de vista

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

Veo que el insertChildmétodo parece agregarse a la elemspropiedad.

Lo que es menos claro para mí es: ¿dónde llama realmente Magento insertChildpara poblar elemsy / o cómo se elemsrellena con los modelos de vista que conforman una colección de componentes de la interfaz de usuario?

Alan Storm
fuente

Respuestas:

2

La única información que puedo encontrar es

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

en la línea 321 de

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

Parece que esto está dentro de una función que combina componentes?

merge: function (components) {
   ...
}

Esto se usa en la línea 73 (función de ejecución) del mismo archivo (layout.js) donde se usa para fusionar nodos.

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));
}

Esta función de ejecución se usa en 2 funciones (proceso y fusión, ambas en layout.js), pero no puedo entender completamente lo que hacen.

Actualizar

Acabo de ver lo siguiente en los documentos de desarrollo: http://devdocs.magento.com/guides/v2.1/ui_comp_guide/concepts/ui_comp_uicollection_concept.html

elems es la propiedad observable que contiene la colección de componentes secundarios de la interfaz de usuario.

elems es la colección de los elementos secundarios de uiCollection. En cuanto a elems es la propiedad observable, las plantillas de los componentes añadidos a elems en el tiempo de ejecución, también se representan

Ben Crook
fuente