Angular动态表单生成(七)

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

这个功能就比较吊炸天了,之前的六篇,都是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>

最终效果如下:

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

原文地址:https://www.cnblogs.com/baiyunchen/p/8496964.html

时间: 2024-10-08 06:49:00

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

Angular动态表单生成(二)

ng-dynamic-forms源码分析 在两个开源项目中,ng-dynamic-forms的源码相较于form.io,比较简单,所以我还勉强能看懂,下面就我自己的理解进行简单分析,若有不对的地方,请大家多多指正. 整体结构分析 ng-dynamic-forms的主要代码均分布在packages文件夹下,其中的Core是各种控件的抽象,其他的文件夹是各个UI框架的具体封装,每个文件夹都是一个可独立编译运行的项目. Core文件夹内容分析 Core文件夹做的事情,基本上是对于各种组件.布局的抽象,

Angular动态表单生成(四)

ng-dynamic-forms实践篇(下) 我们接着上篇,先把小目标中的所有字段都定义出来 这部分就是苦力活儿了,把KendoUiComponent中的formModel完善即可: 1 formModel: DynamicFormControlModel[] = [ 2 new DynamicInputModel({ 3 id: 'firstName', 4 label: '姓名', 5 placeholder: '请输入用户姓名' 6 }), 7 new DynamicRadioGroupM

动态表单生成

1,创建sql drop table QUYJ_CHANGE_CARD; CREATE TABLE QUYJ_CHANGE_CARD ( ID VARCHAR(36) NOT NULL, phone VARCHAR2(100) NOT NULL, CITY VARCHAR2(50) NOT NULL, CREATE_BY VARCHAR2(32), CREATE_DATE DATE, CREATE_NAME VARCHAR2(32), UPDATE_BY VARCHAR2(32), UPDATE

angularjs 动态表单, 原生事件中调用angular方法

https://www.cnblogs.com/wancy86/p/7834067.html 1. 原生事件中调用angular方法, 比如 input的onChange事件想调用angular里面定义的方法 - onChange="angular.element(this).scope().uploadPhoto(this)" <div class="col-md-2"> <input onChange="angular.element

javaweb日记选(动态表单及表的实现)

Java语言也可以创建动态表单,如javaweb创建表单及表 应用场景 项目中往往需要动态的创建一个表单,或者添加一个新的数据模板,这时候因为需要在运行时动态的创建表以及动态的维护表字段甚至表关系 使得普通java解决方案变得困难重重. 实现工具 Hibernate + Spring + Groovy +Freemarker Hibernate 作用很简单负责创建数据库表这样可以避免我们自己去写复杂的sql和判断. Spring 作为桥梁起到连接纽带的作用 Groovy 做为动态语言,在项目运行

如何在.Net Core MVC中为动态表单开启客户端验证

非Core中的请参照: MVC的验证 jquery.validate.unobtrusive mvc验证jquery.unobtrusive-ajax 参照向动态表单增加验证 页面引入相关JS: <script src="~/lib/jquery/dist/jquery.js"></script> <script src="~/lib/jquery-validation/dist/jquery.validate.js"></

vue动态表单

项目需求,需要根据后台接口返回数据,动态添加表单内容 说明:此组件基于Ant Design of Vue 目前支持六种表单控件:文本输入框(TextInput).文本域输入框(TextArea).下拉选择框(SelectInput).下拉多选(SelectMultiple).日期(DataPicker).日期精确到秒(DataPickerSen) 一.文本框 1 <template> 2 <a-form-item :label="label" v-bind="

动态表单数据库设计

需求: 能够根据数据库在界面动态显示表单,包括表单类型.名称等,并且必须提供 添加新表单,修改表单等功能. 为了满足客户不断的需求变化,有时候需要为某商品增加.修改.删除.属性,这样的话以往的数据库表就很难实现, 因为表的字段是定死了 如果你需要增加一个属性的时候 ,就必须修改表,听说这是不允许的~~. 所以我们要设计一个灵活的数据库 下面以电脑设备为例: pc 现有属性 name cpu ram disk 现在我们要为pc添加一个 mainboard 属性. 既然必须提供增加表单,那么我们创建

angular js 表单验证

1 <!doctype html> 2 <html ng-app="myapp"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style> 7 body{ 8 padding: 50px; 9 font-family: "微软雅黑"; 10 } 11 input{ 12 margi