【发布时间】:2021-04-14 21:58:52
【问题描述】:
我正在向我的表单动态添加字段。如果是标准文本字段,它可以与带有 <template> 元素的 Rails + StimulusJS 一起正常工作。
我正在使用 MaterializeCSS 进行样式设置,如果我尝试使用选择菜单做同样的事情,它会中断,而且我在 JS 代码中返回的 innerHTML 似乎与模板标签内的代码不匹配。所以我决定使用一个 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 %>
这是我在 Stimulus 控制器中复制的模板。
这是第一个(并且有效的)选择菜单在 HTML 中的样子:
所以下一步是更改<ul> 和两个<li> 元素+data-target 元素的ID 以定位到右侧的选择菜单。
我最终得到的是这个 JS 代码,它确实添加了具有正确样式的第二个选择菜单,但它不可点击并且不显示选项,尽管它们存在于 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)
}
现在它看起来像这样,我不知道如何使这个东西工作:
【问题讨论】:
-
第二个选择框添加后生成的HTML可以贴出来吗?
标签: javascript ruby-on-rails ruby stimulusjs