У меня есть одно поле выбора, которое имеет несколько вариантов. Одно из них будет иметь некоторые поля в зависимости от значения, другое поле будет скрыто. Я скопировал и расширил компонент js для своего поля, но это не сработало или я сделал это неправильно. Ui компонент поддерживает эту функцию? Как мне этого добиться?
Ниже то, что я сделал:
<field name="field1">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Namespace\ModuleName\Model\Config\Source\Options</item>
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Field name</item>
<item name="visible" xsi:type="boolean">true</item>
<item name="dataType" xsi:type="string">number</item>
<item name="formElement" xsi:type="string">select</item>
<item name="source" xsi:type="string">item</item>
<item name="dataScope" xsi:type="string">field1</item>
<item name="component" xsi:type="string">Pathto/js/form/element/options</item>
<item name="validation" xsi:type="array">
<item name="required-entry" xsi:type="boolean">true</item>
</item>
</item>
</argument>
</field>
<field name="field2Depend1"></field>
<field name="field3Depend1"></field>
jsComponent js/form/element/options
:
define([
'underscore',
'uiRegistry',
'Magento_Ui/js/form/element/select',
'Magento_Ui/js/modal/modal'
], function (_, uiRegistry, select) {
'use strict';
return select.extend({
onChange: function () {
this.enableDisableFields();
},
/**
* Enable/disable fields on Coupons tab
*/
enableDisableFields: function () {
// code check field
}
});
});
источник
initialize
метод в вашем случае, потому что у ui-element нетonLoad
метода. Вы можете получить любое значение поля в любом месте из реестра с помощью клавиши ввода индекса:uiRegistry.get('index = field1')
. Если у вас есть еще вопросы, пожалуйста, обращайтесь ко мне по скайпу (sarj1989), будет проще общаться на русском языке.Решение, предложенное Magentix, время от времени выдает ошибку при использовании инициализации. Это зависит от времени, которое требуется вашему браузеру для рендеринга компонентов. Чтобы это исправить, вы можете использовать setTimeout.
Смотрите код ниже:
источник
Это старый вопрос с несколькими ответами, которые работают, однако я нашел решение, использующее то, что предоставляет Magento (начиная с 2.1.0), без необходимости расширения компонентов. Поскольку несколько вопросов были помечены как дублирующие и направлены сюда, я подумал, что было бы полезно предоставить некоторую информацию по этому варианту.
Все расширяемые компоненты пользовательского интерфейса элемента формы
Magento_Ui/js/form/element/abstract.js
имеютswitcherConfig
настройку, доступную для таких целей, как скрытие / отображение элементов, а также другие действия.switcher
Компонент может быть найден в Magento_Ui / JS / форме / коммутатора для любопытных. Вы можете найти примеры его использования в sales_rule_form.xml и catalog_rule_form.xml . Конечно, если вы уже используете свой собственный пользовательский компонент, вы можете использовать его до тех пор, пока ваш компонент в конечном итоге расширяетсяabstract
что, как представляется, основано на примере кода, приведенном в вопросе.Теперь для более конкретного примера, чтобы ответить на оригинальный вопрос.
В
Namespace/ModuleName/view/adminhtml/ui_component/your_entity_form.xml
вам просто нужно добавить следующие строки в поле х ,settings
что делает контрольный (то есть поле , которое определяет , какие поля скрыты / видны). В вашем примере это будетfield1
.Давайте разберемся с этим немного.
switcher
Компонент содержит массив ,rules
который является то , что мы строим здесь. У каждого<rule>
есть имя, которое является числом в этом примере. Это имя является ключом / индексом массива для этого элемента. Мы используем числа в качестве индексов массивов.Струны тоже должны работать, но я не проверял эту теорию. ОБНОВЛЕНИЕ - Как упомянуто @ChristopheFerreboeuf в комментариях, здесь не работают строки. Это массивы и должны начинаться с0
, а не со строк или 1.Внутри каждого
rule
мы передаем два аргумента.value
- это значение,field1
которое должно сработать, какactions
указано ниже.actions
- Здесь у нас есть еще один массив. Это действия, которые должны запускаться при выполнении условий этого правила. Опять же, имя каждогоaction
- это просто индекс / ключ массива этого элемента.Теперь у каждого
action
есть два аргумента (с необязательным третьим).target
- Это элемент, которым вы хотите манипулировать в рамках этого действия. Если вы не знакомы с тем, как составляются имена элементов ui_component в Magento, вы можете ознакомиться со статьей Alan Storm . Это в основном что-то вроде{component_name}.{component_name}.{fieldset_name}.{field_name}
этого примера.callback
- Вот действия, которые необходимо предпринять по вышеупомянутомуtarget
. Этот обратный вызов должен быть функцией, доступной для целевого элемента. Наш пример используетhide
иshow
. Здесь вы можете начать расширять доступную функциональность.catalog_rule_form.xml
Пример , который я упоминал ранее , использует ,setValidation
если вы хотите увидеть другой пример.<params>
к любому,action
что призывает их. Вы можете увидеть это и вcatalog_rule_form.xml
примере.Наконец, последний внутренний элемент
switcherConfig
является<enabled>true</enabled>
. Это должно быть довольно просто, это логическое значение для включения / выключения функции коммутатора, которую мы только что реализовали.И мы сделали. Таким образом , используя приведенный выше пример , что вы должны увидеть это поле
field2Depend1
отображается , если вы выбираете опцию со значением2
наfield1
, иfield3Depend1
отображается , если вы выбираете опцию со значением3
.Я протестировал этот пример, используя только
hide
иshow
в обязательном поле, и он, похоже, учитывает видимость для проверки. Другими словами, еслиfield2Depend1
требуется, это потребуется только тогда, когда оно видно. Нет необходимости в дальнейшей настройке, чтобы это работало.Надеюсь, что это поможет некоторым, кто ищет более готовое решение.
источник
Есть много ответов на этот вопрос, но большинство из них либо делают предположения о том, полностью ли загружен uiRegistry, либо используют
setTimeout
для очистки стека вызовов, и ждут следующего события EventLop (что, на мой взгляд, все еще является неправильным способом сделайте это - так как вы не можете быть уверены, когда загрузились другие компоненты пользовательского интерфейса - поправьте меня, если я ошибаюсь).Во-первых, конечно, добавьте свой пользовательский компонент JS в конфигурацию поля (подробности см. В других ответах):
Затем, вот пользовательский компонент пользовательского интерфейса, который скрывает или показывает зависимые поля - с комментариями, чтобы объяснить, что происходит.
источник
Если вы получили ошибку, как
Field is Undefined
при инициализации видимости полей, используйтеsetTimeout()
для загрузки зависимых полей:источник
uiRegistry.get('q', function(field) { ... }));
Пользовательский компонент с init:
источник
setTimeout()
вfieldDepend()
потому что Зависимый еще не загружен.На всякий случай, если кто-то борется с решением Erfan , вы должны передать полный путь к полям
dependentFieldNames
, например:Я не уверен, почему form_name должно быть 2 раза, но это сработало для меня.
Для отладки это я положил
console.log(query);
вstatic/adminhtml/Magento/backend/en_US/Magento_Ui/js/lib/registry/registry.js
223 - м линии (ГЭТ () функции непосредственно передthis._addRequest(query, callback)
)источник
Существует несколько способов обработки полевых зависимостей: для простого раскрывающегося списка «Да / Нет», флажка или переключателя можно использовать
imports
илиexports
связать свойства в Magento 2. Решение подробно описано здесь: Зависимые поля в формах компонентов пользовательского интерфейса в Magento 2 без Javascript для логических полей :Для обработки значений другого типа, таких как зависимость от списка значений в раскрывающемся списке или, хотя маловероятно, значение поля ввода, вы можете использовать
switcherConfig
. Проверьте зависимые поля в формах компонентов пользовательского интерфейса в Magento 2 без Javascript для информации.Приведенные выше 2 правила обрабатывают практически все, используя конфигурацию XML. Для более сложных правил вы также можете использовать JavaScript.
Каждое поле в форме компонента пользовательского интерфейса является компонентом, который можно расширить с помощью
component
атрибута для<field component="path to your js" ...>...</field>
. Затем вы можете использовать это полеdata.config
для передачи дополнительной информации компоненту, если компонент является универсальным и повторно используется в нескольких местах в сочетании сimports
илиexports
свойством linking для передачи значений наблюдаемым или методам.Для получения дополнительной информации о свойствах связывания вы можете проверить свойства связывания компонентов пользовательского интерфейса.
источник