欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Angular实现form自动布局

程序员文章站 2022-11-24 08:03:46
本文实例讲解了angular实现form自动布局的详细代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.formlayoutctrl.js...

本文实例讲解了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自动布局的详细代码,希望对大家的学习有所帮助。