根据最新的工作需求中指示,要求Tree树组件为lazy懒加载,且能够进行复选框选择,这个实现简单,设置show-checkbox即可,若此处要求叶子节点也不能包含复选框,就有些困扰了
show-checkbox,图中查看更多为叶子节点,且设置数据节点属性为disabled
<el-tree
ref="treeRef"
class="treeDom"
lazy
:show-checkbox="showCheckbox"
:props="defaultProps"
highlight-current="true"
:check-strictly="true"
:load="lazyLoadMore"
:expand-on-click-node="false"
:default-expanded-keys="defaultExpandKeys"
:default-checked-keys="defaultCheckedKeys"
node-key="id"
@node-expand="handleNodeExpand"
@node-collapse="handleNodeCollapse"
@node-click="handleNodeClick"
@check="handleCheck"
>
<div slot-scope="{ node, data }" class="custom-tree-node">
<!-- 查看更多 -->
<span
v-if="data.id ==='loadmore'"
class="tree-node loadmore"
@click="loadMoreNode(node,data)"
>
<el-link>{{ node.label }}</el-link>
</span>
<!-- 数据到底了 -->
<span
v-if="data.id ==='disabledload'"
class="tree-node no-data"
style="color: #999; cursor: auto;"
>
{{ node.label }}
</span>
<!-- 普通节点 -->
<el-tooltip
class="item"
effect="light"
placement="right-start"
>
<div slot="content" style="max-width: 300px;">
{{ node.label }}
</div>
<span v-if="data.id !=='loadmore' && data.id!=='disabledload'" class="span-tree-node" @click="loadMoreNode(node,data)">{{ node.label }}</span>
</el-tooltip>
</div>
</el-tree>
css样式如下:
::v-deep .span-tree-node {
width: 120px;
position: absolute;
text-overflow: ellipsis;
overflow: hidden;
color: #696969;
top: 50%;
transform: translateY(-50%);
}
::v-deep .treeDom {
width: 100%;
overflow-x: auto;
.custom-tree-node {
width: 100% !important;
position: relative;
}
.el-tree-node {
.el-tree-node__expand-icon + label {
display: none;
}
&.is-expanded {
.is-leaf + label {
display: none !important;
}
}
& > div:nth-last-of-type(2) { // 有children的节点,反推父节点展示可选
.el-tree-node__expand-icon + label {
display: block;
}
}
}
}
isleaf,所以lazy状态下叶子节点不会有加载目录符号,但此时,有个禁用复选框,现在只需要对它设置样式即可::v-deep .el-tree .el-tree-node:last-child {
.el-tree-node__content .is-leaf +.el-checkbox.is-disabled{
display: none;
}
.el-tree-node__content.is-not-clickable{
cursor: pointer;
}
}

3. 分页懒加载实现功能也比较简单,可以复写tree树自带的load方法,load方法内默认携带两个返回参数,一个是node,一个是resolve,即懒加载数据必须是通过resolve就是return 将数据带回,在自定义调用load方法时,多添加了parentNode第二次以上堆积的数据,以及childNode 上一页最后一个option Node节点
async lazyLoadMore(node, resolve, parentNode = [], childNode) {
let id = node?.data?.id, pre = childNode ? childNode.data.name : (node?.data?.name), data = [], arrId = '';
if (node.level === 0) {
id = this.paramNode.parent;
pre = '';
return resolve([{id: id, name: id, leaf: false, disabled: false}]);
}
if (node.level === 1 && !childNode) {
pre = '';
}
// 节点各自的resolve
let result = this.funcResolve.findIndex(ele => ele.node === node);
if (result < 0) {
this.funcResolve.push({node, resolve});
}
// 判断获取分页查询的pre参数
if (id && id.indexOf('/') > -1) {
let arrIndex = id.lastIndexOf('/') + 1;
arrId = id.substring(arrIndex);
if (arrId === pre) pre = '';
}
// lazy加载查询接口
const { data: {items} } = await getInterfaceTreeDictory({parent: id || '', pre: pre || '', pageSize: this.pageSize});
data = items.map(({interface_url: name, full_interface_url: id, disabled = false}) => {
return {name, id, disabled};
});
// 翻页信息添加
if (data.length >= this.pageSize) {
let nearName = data[data.length - 1].name;
data.push({name: '查看更多', id: 'loadmore', nearName: nearName, leaf: true, disabled: true});
}
// 查看更多加载需根据各自的resolve加载数组数据
if (parentNode && parentNode.length > 0) {
parentNode.push(...data);
return resolve(parentNode);
} else {
return resolve(data);
}
},
// 查看更多事件点击
loadMoreNode(node, data) {
if (data.id === 'loadmore') {
let nodeParentKey = node.parent.key ? node.parent.key : this.paramNode.parent;
let childNode = {
data: {
id: nodeParentKey,
name: data.nearName
}
}, resolve = '';
let parentNode = node.parent.childNodes.map(({key: id, label: name, disabled})=>{
return { name, id, disabled };
});
// 剔除自定义查看更多option数据
if (parentNode.length > 0) {
parentNode = parentNode.slice(0, -1);
}
// 选取resolve返回
if (parentNode.length <= this.pageSize * this.pageNumber) {
resolve = this.funcResolve.filter((item)=>{
return item.node === node.parent;
});
this.pageNumber++;
// 调用原生Tree load方法
this.$refs.treeRef.load(node.parent, resolve[0].resolve, parentNode, childNode);
}
}
},
代码内有一点需要注意,即每次查询接口的时候,和后台约定的规则是:不包含分页,需要传值两个参数,一个是parent,即当前节点的上一级所有层级拼接,另一个是pre即当前节点的子集,若第一次加载,pre可为空,若查看更多再一次加载pre为上一次加载数据data的最后一个元素id,作为传参;
eg: a、此时需要点击加载js,即 GET请求下param参数如下parent=172.24.114.143:8080/js&pre=

b、此时继续点击查看更多,则传入parent=172.24.114.143:8080/js&pre=jquery-showloading

我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我刚刚了解到,在Java中,覆盖和隐藏之间是有区别的(静态方法是隐藏的,而不是覆盖),这意味着Java使用早期绑定(bind)和后期绑定(bind)。是否有与方法隐藏类似的东西,或者它只是具有方法重写? 最佳答案 Java具有三种不同的“方法”:实例方法,静态方法和构造函数。Ruby只有一个:实例方法。在Java中,静态方法的行为必须不同于实例方法,因为类不是对象。它们没有类,因此也没有父类(superclass),因此没有要覆盖的内容。在Ruby中,类与其他任何对象一样都是对象,它们具有一个类,该类可以具有父类(superclas
据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
我需要做这样的事情classUser'User',:foreign_key=>'abuser_id'belongs_to:gameendclassGame['JOINabuse_reportsONusers.id=abuse_reports.abuser_id','JOINgamesONgames.id=abuse_reports.game_id'],:group=>'users.id',:select=>'users.*,count(distinctgames.id)ASgame_count,count(abuse_reports.id)asabuse_report_count',: