我正在将字段动态添加到表单中。在使用标准文本字段的情况下,它可以很好地与带有<template>元素的Rails + StimulusJS配合使用。
我正在使用MaterializeCSS设置样式,如果我尝试对选择菜单执行相同的操作,它就会崩溃,并且我在JS代码中返回的模板似乎与innerHTML -tag中的代码不匹配。所以我决定使用div来代替,我复制了它。
视图代码(相关部分):
<div data-nested-form-target="template">
<%= f.fields_for :stations, department.stations.build, child_index: "NEW_RECORD" do |station| %>
<%= render "admin/departments/stations/station_fields", f: station %>
<% end %>这是我在刺激控制器中复制的模板。
这是HTML中第一个(正在运行的)选择菜单的样子:

因此,下一步是更改<ul>和两个<li>元素+ data-target元素的ID,以指向右侧的选择菜单。
我最终得到的是这个JS-Code,它确实添加了第二个具有正确样式的选择菜单,但它不能点击,也不显示选项,尽管它们存在于HTML标记中,并且ID与第一个不同:
add_association(event) {
event.preventDefault()
let random_id = this.generate_random_id()
let content = this.templateTarget.cloneNode(true)
content.getElementsByTagName("ul").item(0).setAttribute("id", random_id)
content.getElementsByClassName("dropdown-trigger").item(0).setAttribute("data-target", random_id)
let list_elements = Array.from(content.getElementsByTagName("ul").item(0).querySelectorAll("li"))
list_elements.forEach((item) => {
let rnd = this.generate_random_id()
item.setAttribute("id", rnd)
})
let html = content.innerHTML.replace(/NEW_RECORD/g, new Date().getTime())
this.linksTarget.insertAdjacentHTML("beforebegin", html)
console.log(html)
let collection = this.basicTarget.getElementsByClassName("nested-fields")
let element = collection[collection.length - 1].getElementsByClassName("animate__animated")[0]
element.classList.add(this.fadeInClass)
} 现在它看起来是这样的,我不知道如何让它工作:

发布于 2021-02-01 02:07:59
我们使用相同的堆栈(Rails、Stimulus.js、Materialize),没有问题。在更新select之后,必须做的一件事是重新初始化Materialize select。例如,这是一个通用嵌套选择控制器,其中不同的子选择根据父选择变为活动状态:
import { Controller } from 'stimulus';
import Materialize from 'materialize-css';
export default class extends Controller {
static targets = [
'childSelect',
]
parentSelectChanged (e) {
const selectedParentMenu = e.target.value;
this.childSelectTargets.forEach(selectElement => {
if (selectElement.dataset.parentMenuName === selectedParentMenu) {
selectElement.disabled = false;
selectElement.value = '';
} else {
selectElement.disabled = true;
}
Materialize.FormSelect.init(selectElement);
});
}
}下面是相应的Haml:
.input-field.col
= select_tag :category,
options_for_select(grouped_conditions.keys.sort, selected_parent_menu_name),
include_blank: 'Select One...',
data: { action: 'nested-select#parentSelectChanged' }
.input-field.col.hide-disabled
- grouped_conditions.each do |parent_menu_name, child_conditions|
= f.select :condition_id,
options_for_select(child_conditions.sort_by(&:menu_name).map{ |tc| [tc.menu_name, tc.id] }, selected_condition_id),
{ include_blank: 'Select One...' },
disabled: selected_parent_menu_name != parent_menu_name,
data: { 'nested-select-target' => 'childSelect', 'parent-menu-name' => parent_menu_name }
= f.label :condition_idhttps://stackoverflow.com/questions/65641789
复制相似问题