如何将 Rails 6 中的 JqTree 与 webpacker 集成,树不是函数

Posted

技术标签:

【中文标题】如何将 Rails 6 中的 JqTree 与 webpacker 集成,树不是函数【英文标题】:How to integrate JqTree in Rails 6 with webpacker, tree is not a function 【发布时间】:2020-08-17 12:47:04 【问题描述】:

我真的很想知道如何将 jqTree 作为 webpacker webpack 集成到我的 Rails 6 应用程序中

更新:- 使用 yarn add jqtree 似乎已经神奇地解决了我的大部分问题,但是我目前面临 tree is not a function 错误

我正在使用 Ancestry gem 来组织菜单项,我需要一个拖放式 javascript 树视图解决方案,该解决方案可以很好地与 Ancestry gem 配合使用。我选择了 jqTree 作为我想要的解决方案,但我很高兴被说服使用替代方案,因为周围似乎有很多,但最初我希望至少能够在 Rails 6 中获得树视图 大概我必须从设置 jQuery 开始,有很多关于如何做到这一点的资源,所以我想这更多的是关于如何在 Rails 6 应用程序中启动和运行任何 jQuery 组件 我想我必须从一个 jsx 文件开始并导入一些东西并将一些 css 导入到 application.scss 中,但这应该是什么样子我真的不确定

到目前为止,我已经按照https://www.botreetechnologies.com/blog/introducing-jquery-in-rails-6-using-webpacker这里的说明设置了 jQuery

我可以通过一个简单的警报确认这一切都已连接并正常工作

我已经取得了一些进步 我没有下载 jqTree 文件,而是使用 yarn 安装 jqTree

替换

我已经下载了 jqTree 文件并将它们解压到我的 javascript/packs 文件夹中名为 jqTree 的文件夹中

yarn add jqtree

现在我已经整理出了没有 ; 的要求。 所以

require ;'jqTree/tree.jquery.js'

变成

require('jqtree')

还在我的 javascript/packs 文件夹中,我创建了一个 sortable.js 文件,其中包含以下内容

require ;'jqTree/tree.jquery.js'

jQuery(window).on('load', function () 
  alert("Done"); //This works!
);

$(function() 
  $('#tree1').tree(
      data: data,
      autoOpen: true,
      dragAndDrop: true
  );
)

;在require语句中让我很困惑,但控制台错误要求它

现在看起来像这样

require("jqtree");
$(function() 
  alert($('#tree1').data('items'));
);

$('#tree1').tree(
    data: $('#tree1').data('items'),
    autoOpen: true,
    dragAndDrop: true
);

使用上面的代码,我得到一个参考错误:数据未定义 在一个视图中,我有以下代码

<%=javascript_pack_tag("sortable")%>

<%= content_tag "div", id: "tree1", data: items: @menu_items do %>
  Loading items...
<% end %>

我现在遇到的问题是我的浏览器正在报告树不是函数的错误。

在我的 application.css.scss 我有

 *= require "jqtree.css"

这不起作用

【问题讨论】:

我还在想着潜入webpack世界但是没有足够的勇气!但这是一个截屏视频,可能会显示路径 gorails.com/episodes/rails-drag-and-drop-sortable @AmitPatel 我正在用制作维基的想法回答我自己的问题。我还有很多细节要添加到我的答案中,但到目前为止我提供的细节应该足以让任何人开始使用 webpacker。值得将脚趾浸入水中 【参考方案1】:

我对此有一个详细的答案,我花了很长时间才整理出来,我将在接下来的几天里用这个细节更新这个答案,但首先要让所有东西都与 jQuery、jQuery-ui 和组件正确连接本身在这种情况下是 jqTree

纱线绝对是答案 从命令行开始添加相关包

yarn add jquery
yarn add jquery-ui
yarn add jqtree

一旦安装了相关的 yarn 包,我需要使 jQuery 和 jQuery-ui 可用,原因我还没有完全理解,一个简单的 require 是不够的

关注这个帖子https://www.botreetechnologies.com/blog/introducing-jquery-in-rails-6-using-webpacker

我在config/webpacker 文件夹中设置了我的 environment.js 文件,看起来像这样

const  environment  = require('@rails/webpacker')
const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin(
    $: 'jquery',
    jQuery: 'jquery'
  )
);
const aliasConfig = 
    'jquery': 'jquery-ui-dist/external/jquery/jquery.js',
    'jquery-ui': 'jquery-ui-dist/jquery-ui.js'
;

environment.config.set('resolve.alias', aliasConfig);

module.exports = environment

重新启动服务器后,我在app/javascript/packs 文件夹中创建了一个名为 test.js 的简单 js 文件,据我所知,这是所有 javascript 现在所在的位置,尽管仍然可以通过将 javascript 放入assets/javascript 文件夹,我被告知,将 webpacker 与 sprockets 混合来提供 javascript 不是一个好主意,但没有解释为什么。 Webpacker 确实也能够提供样式表,但是我仍然更喜欢我的样式表由 app/assets 文件夹中的 sprocket 提供,并使用传统上在 Rails 应用程序中完成的样式表链接标签,因为测试证明这种方式更有效,所以混合以这种方式使用 webpacker 的 sprockets 似乎不是问题。

我只是在 test.js 文件中添加了一个简单的警告消息,只是为了检查 webpacker 和 jQuery 是否都正确连接。

所以 test.js 看起来像这样

require("jquery-ui");
require("jqtree");

$(function() 
  alert($('#tree1').data('items'));
);

然后为了使用 javascript,我只是在视图中包含了一个 javascript 包标签,我想像这样使用它。

在随机的 edit.html.erb 视图中

<h1>Editing Menu Item</h1>

<%= render 'form', menu_item: @menu_item %>

<%= link_to 'Show', [:admin, @menu_item] %> |
<%= link_to 'Back', admin_menu_items_path %>

<%=javascript_pack_tag("test")%>

不需要文件名的路径或扩展名,它就可以工作!

我发现这种方法非常简洁有两个原因

1) 通过将页面特定的 javascript 包含在每个页面中,我不会不必要地膨胀网页,方法是将其包含在 application.js 文件中,该文件默认包含在布局中,因此包含在每个页面中。

2) 我似乎不必担心 DOM 加载事件,并且到目前为止还没有 turbolinks 干扰它的问题,尽管我怀疑这可能更多是靠运气而不是判断,我可能不得不在未来并利用'data-turbolinks-track': 'reload' 选项,但到目前为止一切顺利,这没有必要。

现在一切都已连接并开始工作,是时候让 jqTree 组件与 ancestry gem 一起使用,以便能够为网站构建和组织菜单项,

但到目前为止,使用 yarn top 安装组件并正确连接 jQuery 是一件简单的事情。我最初没有使用纱线,这导致我遇到了各种各样的问题,导致了我最初的问题。

剩下的就是跟着...

【讨论】:

以上是关于如何将 Rails 6 中的 JqTree 与 webpacker 集成,树不是函数的主要内容,如果未能解决你的问题,请参考以下文章

如何修复弃用警告:类级别方法将不再继承 Rails 6.1 中的范围?

Rails 6:通过网络抓取控制器操作创建帖子时如何将用户与创建的帖子相关联

Rails 6将输入添加到页面中的列表

如何将lib中的控制器方法与Rails一起使用?

Ruby on Rails 中的基本图像大小调整

如何在 Rails 6 中使用茧宝石