【问题标题】:Why Am I Getting "Target Element Missing" Error?为什么我会收到“目标元素缺失”错误?
【发布时间】:2021-01-20 19:15:08
【问题描述】:

我的 Rails 6 应用程序出现错误,因为它找不到我的数据目标,但我不明白为什么。

Chrome 控制台中的错误:

Uncaught Error: Missing target element "channel.messages"

我的看法:

<div class="col-sm-10" data-controller="channel" data-channel-id="<%= @channel.id %>">
  <!-- Chat messages -->
  <div class="pr-6 py-4 flex-1">
    <div data-target="channel.messages">
      <%= render @channel.messages %>
    </div>
        <div class="pb-6 pr-4 flex-none">
          <div class="flex rounded-lg border-2 border-grey overflow-hidden">
            <span class="text-3xl text-grey border-r-2 border-grey p-2">
              <svg class="fill-current h-6 w-6 block" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M16 10c0 .553-.048 1-.601 1H11v4.399c0 .552-.447.601-1 .601-.553 0-1-.049-1-.601V11H4.601C4.049 11 4 10.553 4 10c0-.553.049-1 .601-1H9V4.601C9 4.048 9.447 4 10 4c.553 0 1 .048 1 .601V9h4.399c.553 0 .601.447.601 1z"/></svg>
            </span>
            <input type="text" class="w-full px-4" placeholder="Message <%= @other_user.name %>" />
          </div>
      </div>
    </div>
  </div>

  <%= form_with model: [@channel, Message.new], data: { action: "ajax:success->channel#clearMessage" } do |form| %>
    <%= form.text_field :body, class: "form-control", data: { target: "channel.newMessage" } %>
  <% end %>
</div>

_messages 部分:

<div>
  <div class="font-weight-bold"><%= message.user.name %></div>
  <div><%= message.body %></div>
</div>

我的控制器:

import { Controller } from "stimulus"
import consumer from "channels/consumer"

export default class extends Controller {
  static targets = [ "messages", "newMessage" ]

  connect() {
    this.subscription = consumer.subscriptions.create({ channel: "MessageChannel", id: this.data.get("id") }, {
      connected: this._connected.bind(this),
      disconnected: this._disconnected.bind(this),
      received: this._received.bind(this)
    })
  }

  disconnect() {
    consumer.subscriptions.remove(this.subscription)
  }

  _connected() {
  }

  _disconnected() {
  }

  _received(data) {
    if (data.message) {
      this.messagesTarget.insertAdjacentHTML('beforeend', data.message)
    }
  }

  clearMessage(event) {
    this.newMessageTarget.value = ''
  }
}

当我检查 HTML 时,它显示:

<div data-target="channel.messages">

【问题讨论】:

  • 好像没问题。也许您的 HTML 中有多个 data-controller="channel"
  • @nathanvda 就是这样!如果您发布答案,我会选择它。谢谢。

标签: ruby-on-rails stimulusjs


【解决方案1】:

显示的代码看起来非常好。我能想到的唯一导致这种行为的事情是,如果您的 HTML 中有多个 data-controller="channel"

【讨论】:

  • 为什么这会是个问题?不支持重叠控制器吗?
  • 我的想法是有另一个 div 具有相同的控制器,但缺少目标。
【解决方案2】:

这里的问题是数据目标属性。你需要使用:

data-channel-target

定义显示这种结构:

数据-你的控制器-目标

【讨论】:

  • 这取决于使用哪个 Stimulus 版本。 data-yourcontroller-target="target_name" 适用于 Stimulus 2。较旧的(恕我直言)版本是 data-target="yourcontroller.target_name"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
  • 2018-06-22
  • 2020-01-12
相关资源
最近更新 更多