Saya memiliki satu bidang pilih yang memiliki beberapa opsi. Salah satunya akan memiliki beberapa bidang bergantung pada nilai, bidang lain akan disembunyikan. Saya telah menyalin dan memperluas js komponen untuk bidang saya tetapi tidak berhasil atau saya melakukannya dengan cara yang salah. Komponen Ui mendukung fitur ini? Bagaimana saya bisa mencapai ini?
Di bawah ini yang saya lakukan:
<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
}
});
});
sumber
initialize
metode ini dalam kasus Anda karena ui-elemen tidak memilikionLoad
metode. Anda bisa mendapatkan nilai lapangan di setiap tempat dari registry menggunakan kunci indeks masukan:uiRegistry.get('index = field1')
. Jika Anda memiliki pertanyaan lebih lanjut, silakan, hubungi saya di skype (sarj1989) akan lebih mudah untuk berkomunikasi dalam bahasa Rusia.Solusi yang disarankan oleh Magentix akan melemparkan kesalahan dari waktu ke waktu saat menggunakan inisialisasi. Tergantung pada waktu yang dibutuhkan browser Anda untuk membuat komponen. Untuk memperbaikinya Anda bisa menggunakan setTimeout.
Lihat kode di bawah ini:
sumber
Ini adalah pertanyaan lama dengan beberapa jawaban yang berfungsi, namun saya telah menemukan solusi menggunakan apa yang Magento sediakan (pada 2.1.0) tanpa perlu memperluas komponen. Karena beberapa pertanyaan telah ditandai sebagai rangkap dan diarahkan di sini saya pikir akan bermanfaat untuk memberikan beberapa informasi tentang opsi ini.
Semua komponen elemen bentuk ui yang memperluas
Magento_Ui/js/form/element/abstract.js
memilikiswitcherConfig
pengaturan yang tersedia untuk tujuan seperti menyembunyikan / menunjukkan elemen serta tindakan lainnya. Theswitcher
komponen dapat ditemukan di Magento_Ui / js / form / switcher untuk penasaran. Anda dapat menemukan contoh penggunaannya di sales_rule_form.xml dan catalog_rule_form.xml . Tentu saja jika Anda sudah menggunakan komponen kustom Anda sendiri, Anda masih dapat menggunakan ini selama komponen Anda pada akhirnya meluasabstract
yang tampaknya merupakan kasus berdasarkan pada contoh kode yang disediakan dalam pertanyaan.Sekarang untuk contoh yang lebih spesifik untuk menjawab pertanyaan awal.
Dalam
Namespace/ModuleName/view/adminhtml/ui_component/your_entity_form.xml
Anda hanya perlu menambahkan berikut ke bidangsettings
yang melakukan pengontrolan (yaitu bidang yang menentukan bidang mana yang tersembunyi / terlihat). Dalam contoh Anda ini akan menjadifield1
.Mari kita jabarkan sedikit. The
switcher
komponen berisi arrayrules
yang adalah apa yang kita membangun di sini. Masing-masing<rule>
memiliki nama yang merupakan angka dalam contoh ini. Nama ini adalah kunci larik / indeks untuk item ini. Kami menggunakan angka sebagai indeks array.String harus bekerja juga, tetapi saya belum menguji teori ini. PEMBARUAN - Seperti yang disebutkan oleh @ChristopheFerreboeuf dalam komentar, string untuk tidak berfungsi di sini. Ini adalah array dan harus dimulai dengan0
, bukan string atau 1.Di dalam masing-masing
rule
kita melewati dua argumen.value
- Ini adalah nilaifield1
yang harus memicu yangactions
ditentukan di bawah ini.actions
- Di sini kita memiliki array lain. Ini adalah tindakan yang akan dipicu ketika kondisi aturan ini dipenuhi. Sekali lagi,action
nama masing - masing hanyalah indeks array / kunci dari item itu.Sekarang masing-masing
action
memiliki dua argumen juga (dengan ke-3 opsional).target
- Ini adalah elemen yang ingin Anda manipulasi di bawah tindakan ini. Jika Anda tidak terbiasa dengan bagaimana nama elemen ui_component disusun di Magento, Anda dapat memeriksa artikel Alan Storm . Ini pada dasarnya seperti{component_name}.{component_name}.{fieldset_name}.{field_name}
dalam contoh ini.callback
- Berikut adalah tindakan yang harus diambil pada yang disebutkan di atastarget
. Panggilan balik ini harus berupa fungsi yang tersedia pada elemen yang ditargetkan. Contoh kami menggunakanhide
danshow
. Di sinilah Anda dapat mulai memperluas fungsionalitas yang tersedia. Thecatalog_rule_form.xml
contoh yang saya sebutkan penggunaan sebelumnyasetValidation
jika Anda ingin melihat contoh yang berbeda.<params>
apa punaction
yang memanggil mereka. Anda dapat melihat ini dalamcatalog_rule_form.xml
contoh juga.Akhirnya item terakhir di dalamnya
switcherConfig
adalah<enabled>true</enabled>
. Ini seharusnya cukup mudah, ini adalah Boolean untuk mengaktifkan / menonaktifkan fungsi switcher yang baru saja kami implementasikan.Dan kita sudah selesai. Jadi menggunakan contoh di atas apa yang harus Anda lihat adalah bidang yang
field2Depend1
ditampilkan jika Anda memilih opsi dengan nilai2
aktiffield1
, danfield3Depend1
ditampilkan jika Anda memilih opsi dengan nilai3
.Saya telah menguji contoh ini hanya dengan menggunakan
hide
danshow
pada bidang yang diperlukan dan itu tampaknya mempertimbangkan visibilitas untuk validasi. Dengan kata lain, jikafield2Depend1
diperlukan hanya akan diperlukan saat terlihat. Tidak perlu konfigurasi lebih lanjut untuk itu berfungsi.Semoga ini memberikan bantuan bagi siapa pun yang mencari solusi yang lebih out-of-the-box.
sumber
Ada banyak jawaban untuk pertanyaan ini, tetapi kebanyakan dari mereka membuat asumsi apakah uiRegistry sudah terisi penuh, atau digunakan
setTimeout
untuk menghapus tumpukan panggilan, dan menunggu eventloop berikutnya (yang menurut saya masih merupakan cara yang salah untuk lakukan itu - karena Anda tidak dapat memastikan kapan komponen ui lainnya telah dimuat - koreksi saya jika saya salah).Pertama, tentu saja, tambahkan komponen JS khusus Anda ke konfigurasi bidang (lihat jawaban lain untuk detail):
Lalu, inilah komponen UI khusus yang menyembunyikan atau menampilkan bidang dependen - dengan komentar untuk menjelaskan apa yang terjadi.
sumber
Jika Anda mendapat kesalahan seperti
Field is Undefined
saat visibilitas bidang yang diinisialisasi, gunakansetTimeout()
untuk memuat bidang yang tergantung:sumber
uiRegistry.get('q', function(field) { ... }));
Komponen khusus dengan init:
sumber
setTimeout()
difieldDepend()
karena tergantung tidak dimuat belum.Untuk berjaga-jaga seandainya seseorang kesulitan dengan solusi Erfan , Anda harus melewati jalur penuh ke bidang
dependentFieldNames
, misalnya:Saya tidak yakin mengapa form_name harus 2 kali, tetapi ini berhasil bagi saya.
Untuk debug ini saya taruh
console.log(query);
distatic/adminhtml/Magento/backend/en_US/Magento_Ui/js/lib/registry/registry.js
baris ke 223 (fungsi get () sebelumthis._addRequest(query, callback)
)sumber
Ada beberapa cara untuk menangani dependensi bidang, untuk dropdown Ya / Tidak sederhana, kotak centang atau switcher, Anda dapat menggunakan
imports
atauexports
menghubungkan properti di Magento 2. Solusi dibahas secara rinci di sini: Bidang dependen dalam bentuk komponen UI di Magento 2 tanpa Javascript untuk bidang boolean :Untuk menangani tipe nilai lainnya seperti ketergantungan pada daftar nilai dalam dropdown atau meskipun tidak mungkin, nilai bidang input, Anda bisa menggunakan
switcherConfig
. Periksa bidang Dependen dalam bentuk komponen ui di Magento 2 tanpa Javascript untuk informasi.2 aturan di atas, menangani hampir semua menggunakan konfigurasi XML. Untuk aturan yang lebih kompleks, Anda dapat menggunakan JavaScript juga.
Setiap bidang dalam bentuk komponen UI adalah komponen yang dapat diperluas menggunakan
component
atribut untuk<field component="path to your js" ...>...</field>
. Anda kemudian dapat menggunakan bidang inidata.config
untuk meneruskan lebih banyak informasi ke komponen, jika komponen itu generik dan digunakan kembali di beberapa tempat, dikombinasikan denganimports
atauexports
menghubungkan properti untuk meneruskan nilai ke observasi atau metode.Untuk informasi lebih lanjut tentang properti penautan Anda dapat memeriksa Properti penautan komponen UI
sumber