首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails + StimulusJS动态创建的选择菜单不起作用

Rails + StimulusJS动态创建的选择菜单不起作用
EN

Stack Overflow用户
提问于 2021-01-09 18:53:02
回答 1查看 576关注 0票数 1

我正在将字段动态添加到表单中。在使用标准文本字段的情况下,它可以很好地与带有<template>元素的Rails + StimulusJS配合使用。

我正在使用MaterializeCSS设置样式,如果我尝试对选择菜单执行相同的操作,它就会崩溃,并且我在JS代码中返回的模板似乎与innerHTML -tag中的代码不匹配。所以我决定使用div来代替,我复制了它。

视图代码(相关部分):

代码语言:javascript
复制
<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与第一个不同:

代码语言:javascript
复制
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)
    } 

现在它看起来是这样的,我不知道如何让它工作:

EN

回答 1

Stack Overflow用户

发布于 2021-02-01 02:07:59

我们使用相同的堆栈(Rails、Stimulus.js、Materialize),没有问题。在更新select之后,必须做的一件事是重新初始化Materialize select。例如,这是一个通用嵌套选择控制器,其中不同的子选择根据父选择变为活动状态:

代码语言:javascript
复制
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:

代码语言:javascript
复制
.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_id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65641789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档