Angular实现form自动布局
程序员文章站
2022-11-24 08:03:46
本文实例讲解了angular实现form自动布局的详细代码,分享给大家供大家参考,具体内容如下
效果图:
具体代码:
1.formlayoutctrl.js...
本文实例讲解了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自动布局的详细代码,希望对大家的学习有所帮助。