本文实例讲解了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自动布局的详细代码,希望对大家的学习有所帮助。
本文地址:https://www.stayed.cn/item/16476
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我