Angular实现form自动布局


Posted in Javascript onJanuary 28, 2016

本文实例讲解了Angular实现form自动布局的详细代码,分享给大家供大家参考,具体内容如下

效果图:

Angular实现form自动布局

具体代码:

1.formlayoutCtrl.js

'use strict';
sxlcApp.controller('formlayoutCtrl', ['$scope', '$filter', '$http', function($scope, $filter, $http){
 $scope.title = '表单布局中';
 $scope.dataParamsUrl = './php/formlayout.json';
 
 $scope.resetForm = function(num){
  console.log(num)
 }
}]);

2. formlayout.html 

<div class="container" ng-controller="formlayoutCtrl">
 <span>{{title}}</span>
 <form class="form-horizontal" style="width: 400px;" name="formlayout" w5c-form-validate="validateOptions" novalidate>
  <form-layout url="dataParamsUrl">
    
  </form-layout>
  <button type="submit" class="btn btn-sm btn-info">
   提交
  </button>
  <button type="reset" class="btn btn-sm btn-danger" ng-click="resetForm()">
   重置
  </button>
 </form>
</div>

3. formlayout.html

<div class="container" ng-controller="formlayoutCtrl">
 <span>{{title}}</span>
 <form class="form-horizontal" style="width: 400px;" name="formlayout" w5c-form-validate="validateOptions" novalidate>
  <form-layout url="dataParamsUrl">
    
  </form-layout>
  <button type="submit" class="btn btn-sm btn-info">
   提交
  </button>
  <button type="reset" class="btn btn-sm btn-danger" ng-click="resetForm()">
   重置
  </button>
 </form>
</div>

4. formlayoutdirective.js 

'use strict';
angular.module('form.layout', [])
/**
 * 定义布局的服务
 * @method
 * @param {Object} ) this.defaultTemplate [布局的模板]
 * @return {[type]}  [description]
 */
.provider('formLayout', function(){
 // 定义布局构造函数 
 function FormLayoutFn(){
  /**
   * 定义表单元素的模板
   * @type {{text: string, radio: string, checkbox: string, remember: string, range: string, time: string, date: string, datetime: string, search: string, select: string}}
   */
  this.elementTemplate = {
    text : '\<div class="form-group">\
       <label></label>\
       <input type="text" class="form-control" />\
      </div>',
    password : '<div class="form-group">\
        <label></label>\
        <input type="password" class="form-control" />\
       </div>',
    radio : '\<div class="form-group">\
        <label></label>\
        <div id="radiolist"></div>\
       </div>',
    email : '\<div class="form-group">\
       <label></label>\
       <input type="email" class="form-control" />\
      </div>',
    tel : '\<div class="form-group">\
       <label></label>\
       <input type="tel" class="form-control" />\
      </div>',
    url : '\<div class="form-group">\
       <label></label>\
       <input type="url" class="form-control" />\
      </div>',
    number : '\<div class="form-group">\
       <label></label>\
       <input type="number" class="form-control" />\
      </div>',
    checkbox : '<div class="form-group">\
        <label></label>\
        <div id="checkboxlist"></div>\
        </div>',
    range : '<div class="form-group">\
        <label></label>\
        <input type="range"/>\
       </div>',
    time : '<div class="form-group">\
        <label></label>\
        <input type="time" class="form-control"/>\
       </div>',
    date : '<div class="form-group">\
        <label></label>\
        <input type="date" class="form-control"/>\
       </div>',
    datetime : '<div class="form-group">\
        <label></label>\
        <input type="datetime" class="form-control"/>\
       </div>',
    search : '<div class="form-group">\
        <label></label>\
        <input type="search" class="form-control"/>\
       </div>',
    select : '<div class="form-group">\
        <label></label>\
        <select class="form-control"></select>\
       </div>',
    textarea : '<div class="form-group">\
        <label></label>\
        <textarea class="form-control"></textarea>\
       <div>',
   };
  //默认的模板, 可以使用如下的方式使用默认的模板
  this.defaultTemplate = '<input>';
  this.radioTmpl = '<label class="radio-inline"><input type="radio">radiotitle</label>';
  this.checkboxTmpl = '<label class="checkbox-inline"><input type="checkbox">checkboxtitle</label>';
 }
 
 FormLayoutFn.prototype = {
  /**
   * 获取模板
   * @method getElementTemplate
   * @return {[type]}   [description]
   */
  getElementTemplate : function () {
   return this.elementTemplate;
  },
 
  /**
   * 配置布局元素的模板
   * @param configTemplate
   */
  setElementTemplate : function(configTemplate){
   this.elementTemplate = angular.extend(this.elementTemplate, configTemplate);
  },
 
  /**
   * 实现布局函数
   * @method layout
   * @param {[type]} eleObj  指令中的模板对象
   * @param {[type]} elementObj 表单布局元素对象
   * @return {[type]}   [description]
   */
  layout : function(eleObj, elementObj){
   var thiz = this;
   var elementTemplate = this.elementTemplate;
   var defaultTemplate = this.defaultTemplate;
   var radioTmpl = this.radioTmpl;
   var checkboxTmpl = this.checkboxTmpl;
 
   if (angular.isObject(eleObj) && angular.isObject(elementObj)) {
    angular.forEach(elementObj, function(elementObjIterm, elementObjKey){
     //console.log(elementObjIterm.attr.type);
     var type = $.trim(elementObjIterm.attr.type);
     var templateObj = angular.element(elementTemplate[type]);
     // console.log(templateObj.find('input'));
     switch(type){
      case 'textarea' :
       var fileld = templateObj.find('textarea');
       // var templateObj = angular.element(elementTemplate.textarea);
       break;
      case 'select' :
       var fileld = templateObj.find('select');
       // var templateObj = angular.element(elementTemplate.select);
       break;
      case 'button' :
       var fileld = templateObj.find('button');
       // var templateObj = angular.element(elementTemplate.button);
       break;
      case 'datepicker' :
       var fileld = templateObj.find('datepicker');
       // var templateObj = angular.element(elementTemplate.datepicker);
       break;
      case 'radio' :
       var fileld = templateObj.find('#radiolist');
       // var templateObj = angular.element(elementTemplate.datepicker);
       break;
      case 'checkbox' :
       var fileld = templateObj.find('#checkboxlist');
       // var templateObj = angular.element(elementTemplate.datepicker);
       break;
      default :
       var fileld = templateObj.find('input') ;
       break;
     }
     // 设置 label 的标签名字
     templateObj.find('label').html(elementObjIterm.labeltext);
 
     if ('select' == type) {
      var options = elementObjIterm.attr.option;
      angular.forEach(options, function(content, val){
       var option = angular.element('<option value="'+val+'">'+content+'</option>');
       fileld.append(option);
      });
     }else if('radio' == type){
      var options = elementObjIterm.attr.option;
      angular.forEach(options, function(content, val){
       var tmpl = radioTmpl.replace('radiotitle', content);
       var tmplObj = angular.element(tmpl);
       tmplObj.find('input').attr('value', val);
       fileld.append(tmplObj);
      });
      // console.log(templateObj.find('label'));
     }else if('checkbox' == type){
      var options = elementObjIterm.attr.option;
      angular.forEach(options, function(content, val){
       var tmpl = checkboxTmpl.replace('checkboxtitle', content);
       var tmplObj = angular.element(tmpl);
       tmplObj.find('input').attr('value', val);
       fileld.append(tmplObj);
      });
     }else{
      angular.forEach(elementObjIterm.attr, function(val, attrname){
       fileld.attr(attrname, val);
      })
     }
      
     eleObj.append(templateObj.append(fileld));
    });
 
    return eleObj;
   }else{
    throw '传入的参数不是对象';
   }
    
  }
 
 };
 // 实例布局化构造类
 var formLayout = new FormLayoutFn();
 
 this.$get = function () {
  return formLayout;
 };
 //配置布局元素的模板
 this.setElementTemplate = function (configTemplate) {
  if (!configTemplate) return ;
  formLayout.setElementTemplate(configTemplate);
 }
});
/**
 * 指令的实现
 * @method
 * @return {[type]}    [description]
 */
angular.module('form.layout')
 .directive('formLayout', ['$http', '$filter', 'formLayout',function($http, $filter, formLayout){
  return {
   restrict : 'AE',
   scope  : {
    url : "=",
    // fields : {}
   },
   replace : true,
   // templateUrl : './tmpl/formlayout.html',
   transclude : true,
   // require : '?^formLayout',
   link : function(scope, elem, attrs){
    if(!scope.url){
     throw '请在指令参数url中传入获取数据的 url 的值';
    }
    $http.get(scope.url).success(function(successData, status, headers, config){
     if (!successData.code) {
      scope.fields = successData.data;
      processFormFilds(successData.data);
     }else{
      throw '获取表单数据失败';
     }
    })
 
    function processFormFilds(data){
     formLayout.layout(elem, data);
     // console.log(data);
    }
   }
  }
 }]);

以上就是Angular实现form自动布局的详细代码,希望对大家的学习有所帮助。

Javascript 相关文章推荐
JavaScript 函数调用规则
Sep 14 Javascript
JavaScript学习笔记(一) js基本语法
Oct 25 Javascript
一个背景云变换js特效 鼠标移动背景云变化
Dec 28 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
Apr 02 Javascript
jQuery图片加载显示loading效果
Nov 04 Javascript
浅析BootStrap中Modal(模态框)使用心得
Dec 24 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
Jun 13 Javascript
vue中配置mint-ui报css错误问题的解决方法
Oct 11 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
Apr 22 Javascript
详解js跨域请求的两种方式,支持post请求
May 05 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 Javascript
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
理解javascript中的MVC模式
Jan 28 #Javascript
jQuery获取checkbox选中的值
Jan 28 #Javascript
探讨JavaScript语句的执行过程
Jan 28 #Javascript
Javascript复制实例详解
Jan 28 #Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
Jan 28 #Javascript
基于JavaScript的操作系统你听说过吗?
Jan 28 #Javascript
js+canvas绘制矩形的方法
Jan 28 #Javascript
You might like
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
php连接mysql数据库
2017/03/21 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
Vue响应式原理详解
2017/04/18 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
前端 javascript 实现文件下载的示例
2020/11/24 Javascript
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Python实现字典依据value排序
2016/02/24 Python
Python3.5 创建文件的简单实例
2018/04/26 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
python中yield的用法详解
2021/01/13 Python
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
银行委托书范本
2014/09/28 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
2014年客房部工作总结
2014/11/22 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
关于幸福的感言
2015/08/03 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js