Magento 2: что населяет «элементы» в компоненте пользовательского интерфейса

9

KnockoutJS шаблон верхнего уровня для перечисления UI Component выглядит следующим образом

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

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

Это переводится Magento в следующий необработанный код KnockoutJS.

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

В любом случае этот шаблон будет foreachповерх elemsсвойства модели представления .

Если я смотрю на модуль RequireJS, который (я думаю>) возвращает класс конструктора модели представления

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

Я вижу, что insertChildметод, кажется, добавляет к elemsсвойству.

Что менее понятно для меня: где Magento фактически вызывается insertChildдля заполнения elemsи / или как elemsзаполняются моделями представлений, которые составляют коллекцию компонентов пользовательского интерфейса?

Алан Сторм
источник
Я думаю, что это сделано здесь: app / code / Magento / Ui / view / base / web / js / core / renderer / layout.js
ps202

Ответы:

2

Единственная информация, которую я могу найти,

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

по строке 321

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

Кажется, это внутри функции, которая объединяет компоненты?

merge: function (components) {
   ...
}

Это используется в строке 73 (функция запуска) того же файла (layout.js), где он используется для объединения узлов.

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

Эта функция запуска используется в 2 функциях (процесс и слияние - оба в layout.js), но я не могу полностью понять, что они делают.

Обновить

Я только что видел следующее в документации разработчика - http://devdocs.magento.com/guides/v2.1/ui_comp_guide/concepts/ui_comp_uicollection_concept.html

elems - это наблюдаемое свойство, которое содержит коллекцию дочерних компонентов пользовательского интерфейса.

elems - это коллекция дочерних элементов uiCollection. Поскольку elems является наблюдаемым свойством, шаблоны компонентов, добавляемых к elems во время выполнения, также отображаются

Бен Крук
источник