动态表单生成之拖拽生成表单(上)

这个功能就比较吊炸天了,之前的六篇,都是ng-dynamic-forms自带的功能,可能很多的说明官方的文档都已经写了,我只是个搬运工,而在这篇文章中,我将化身一个工程师,来自己创造点东西,让我们一起来期待吧~

导入相关类库

拖拽功能看似吊炸天,其实HTML5中已经有一套标准来定义它了,所以并没有那么难以实现,这篇关于拖拽的文章写得还可以,大家可以先看看:http://www.zhangxinxu.com/wordpress/2011/02/html5-drag-drop-%E6%8B%96%E6%8B%BD%E4%B8%8E%E6%8B%96%E6%94%BE%E7%AE%80%E4%BB%8B/

既然是一些通用的东西,那应该来说,会有angular的封装,在github上找了一下,果然是找到了一个比较不错的类库:https://github.com/ObaidUrRehman/ng-drag-drop,看他的Demo,也基本上可以满足我们的需求。Demo的效果如下:

那我们果断按照这个组件的说明,将它引入到我们的项目中,同时也将bootstrap引入进来,方便后面布局使用:

npm install ng-drag-drop –-save
npm install bootstrap –-save

然后在.angualr-cli.json中的styles节点中,将它和bootstrap的默认样式添加进去:

"styles": [
"styles.css",
"../node_modules/@progress/kendo-theme-default/dist/all.css",
"../node_modules/bootstrap/dist/css/bootstrap.css",
"../node_modules/ng-drag-drop/style.css"
],

接下来,还需要将这个组件的js在.angualr-cli.json中的scripts节点中引入:

"scripts": [
"../node_modules/ng-drag-drop/index.js"
]

最后在app.modules.ts中imports中导入它:

imports: [
....
NgDragDropModule.forRoot()
],

万事布局难

所谓万事布局难,我们先画一个简单的UI,用来实现我们的拖拽效果吧~

先使用angular cli 生成一个新的Component,并将它的路由配置好,具体步骤可以参考我们之前添加kendo-ui的组件时的步骤,我们将这个新的Component命名为:kendo-ui-drag-drop。

然后在HTML页面中添加一下代码:

<div  style="padding:20px;">
<div class="row" style="margin-top:20px;border: 1px solid;padding:10px;">
<div class="col-md-4">
<ul class="list-group">
<li class="list-group-item" >TextBox</li>
<li class="list-group-item" >Select</li>
<li class="list-group-item" >TextArea</li>
<li class="list-group-item" >Password</li>
<li class="list-group-item" >Number</li>
</ul>
</div>
<div class="col-md-8">
<h4>请将表单元素拖拽到这里</h4>
<div style="min-height: 300px;background-color: #EDEDEE"></div>
</div>
</div>
</div>

最终效果如下:

定义拖拽事件

首先,我们让左边的Textbox等控件可以拖动。参考ng-drap-drop可知,只需要在需要可拖拽的元素上,加上一个draggable属性即可:

如下:

<ul class="list-group">
<li class="list-group-item" draggable>TextBox</li>
<li class="list-group-item" draggable>Select</li>
<li class="list-group-item" draggable>TextArea</li>
<li class="list-group-item" draggable>Password</li>
<li class="list-group-item" draggable>Number</li>
</ul>

这样子,我们的左边就可以到处拖了~

那怎么可以让拖动到右边我们布局中表单区域那边,触发特定的事件呢?其实也So Easy,我们只需要在我们定义好的放置表单的div中,添加droppable属性,并且在有元素拖动到他上面的时候,会触发一个onDrop事件,我们可以订阅这个事件,来得知有元素拖动过来了。

具体代码如下:

<div class="col-md-8">
<h4>请将表单元素拖拽到这里</h4>
<div style="min-height: 300px;background-color: #EDEDEE" droppable (onDrop)="onDropToForm($event)"></div>
</div>
onDropToForm(event) {
console.log(event);
}

在这里,event对象中有一个dragData属性,即拖拽元素中的一些数据,这些数据我们需要在被拖拽元素中定义,及在上面的 draggable元素中绑定数据 [dragData] = “要绑定的数据”,我们改写上面被拖拽元素的代码如下:

<ul class="list-group">
<li class="list-group-item" draggable [dragData]="{type:'TextBox'}">TextBox</li>
<li class="list-group-item" draggable [dragData]="{type:'Select'}">Select</li>
<li class="list-group-item" draggable [dragData]="{type:'TextArea'}">TextArea</li>
<li class="list-group-item" draggable [dragData]="{type:'Password'}">Password</li>
<li class="list-group-item" draggable [dragData]="{type:'Number'}">Number</li>
</ul>

最终效果如下:

由于篇幅限制,这篇就写到这里吧,下篇接着来~~

Angular动态表单生成(七)的更多相关文章

  1. Angular动态表单生成(八)

    动态表单生成之拖拽生成表单(下) 我们的动态表单,最终要实现的效果与Form.io的在线生成表单的效果类似,可以参考它的demo地址:https://codepen.io/travist/full/x ...

  2. Angular动态表单生成(一)

    好久不写博客了,手都生了,趁着最近老大让我研究动态表单生成的时机,撸一发博客~~ 开源项目比较 老大丢给我了两个比较不错的开源的动态表单生成工具,这两个项目在github上的star数量基本持平: h ...

  3. Angular动态表单生成(五)

    动态表单生成之布局 到上面的篇章为止,我们已经把表单比较完整的生成出来了,也实现了一些验证功能,可以说,我们截止这里,就已经可以满足我们的大部分表单生成需求了~ 但是: 目前来说,我们对于表单的布局只 ...

  4. Angular动态表单生成(六)

    动态表单之根据Json生成表单 我们在实际的使用中,动态表单往往是由服务器端的一系列配置,然后返回数据给客户端,最后客户端根据数据来动态的生成表单.那么怎么像我们上面所描述的这样,生成一个可以让我们的 ...

  5. Angular动态表单生成(二)

    ng-dynamic-forms源码分析 在两个开源项目中,ng-dynamic-forms的源码相较于form.io,比较简单,所以我还勉强能看懂,下面就我自己的理解进行简单分析,若有不对的地方,请 ...

  6. Angular动态表单生成(三)

    ng-dynamic-forms实践篇(上) 定个小目标 先来定个小目标吧,我们要实现的效果: 动态生成一个表单,里面的字段如下: 字段名称 字段类型 验证 备注 姓名 text 必填,长度小于15 ...

  7. Angular动态表单生成(四)

    ng-dynamic-forms实践篇(下) 我们接着上篇,先把小目标中的所有字段都定义出来 这部分就是苦力活儿了,把KendoUiComponent中的formModel完善即可: formMode ...

  8. form-create 3.0 版本发布,好用的Vue3版本动态表单生成组件

    form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持2个UI框架,并且支持生成任何 Vue 组件.内置20种常用表单组件和自定义组件,再复杂 ...

  9. Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)

    Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成) 动态表单生成 ElementUI官网引导 Element表单生成 Element动态增减表单,在线代码 关键配置 templa ...

随机推荐

  1. Oracle数据库进行撤销

    第一步:在v$sqlarea 这视图里面找到你操作那条SQL的时间;select r.FIRST_LOAD_TIME,r. from v$sqlarea r order by r.FIRST_LOAD ...

  2. 地图的可视化--Folium

    1.安装folium pip install MarkupSafe-0.23-cp34-none-win_amd64.whl pip install Jinja2-2.8-py2.py3-none-a ...

  3. 2017 先知创新大会:有 ZHI 而来

    先知创新大会( XIANZHI INNOVATION CONFERENCE ) 是聚焦安全行业创新的行业盛事, 旨在推动安全技术的进步和发展. 先知大会的主题是“极致·眼界·创新” 极致:追求技术的极 ...

  4. python的学习笔记之——time模块常用内置函数

    1.Python time time()方法 Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数). time()方法语法: time.time() 举例: #! ...

  5. 强网杯2018 pwn复现

    前言 本文对强网杯 中除了 2 个内核题以外的 6 个 pwn 题的利用方式进行记录.题目真心不错 程序和 exp: https://gitee.com/hac425/blog_data/blob/m ...

  6. 润乾配置连接kingbase(金仓)数据库

     问题背景 客户根据项目的不同,使用润乾连接的数据库类型各种各样,此文针对前几日使用润乾设计器连接kingbase金仓数据库做一个说明. kingbase金仓数据库是一款国产数据库,操作方式和配置 ...

  7. Activity被回收导致fragment的getActivity为空

    在编写含有Fragment代码的时候,经常会遇到这种情况,假如app长时间在后台运行,再点击进入会crash,而且fragment页面有重叠的现象. 如果系统内存不足.或者切换横竖屏.或者app长时间 ...

  8. AWS CSAA -- 03 Identity Access Management IAM

    009 IAM 101 012 IAM Summary 问题汇总: Lab1:对root account进行加固 Lab 2:利用CloudWatch设置BillingAlarm

  9. leetCode题解之First Missing Positive

    1.问题描述 2.题解思路 本题的思路是对于数组中每个正的元素,应该将其放到数组中对应的位置,比如元素1 ,应该放在数组的第一个位置.以此类推,最后检查数组中元素值和下标不匹配的情况. 3.代码 in ...

  10. c# 线程池:开启10个线程运行Fibonacci,并在所有线程运行完后,得出结果。

    namespace CAThreadPool { class ThreadpoolDemo6 { static void Main(string[] args) { ; // One event is ...