Angular实现form自动布局_AngularJS

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索angular
, form自动布局
Angular自动布局
angularjs form提交、angularjs formdata、angularjs form、angularjs form验证、angularjs ng form,以便于您获取更多的相关知识。

时间: 2024-10-31 23:48:22

Angular实现form自动布局_AngularJS的相关文章

Angular 应用技巧总结_AngularJS

angular的核心思想是通过数据驱动一切,其他东西都是数据的延伸. 套用Javascript一切皆对象的思想,在angular中可以说一切皆数据.   关于项目构建        (1) requirejs以及Yeoman     在刚开始接触或者使用Angular的时候,总会疑惑与类似的问题,我实践的答案是不需要requirejs或者Yeoman.前者不使用,因为angular本身有module的实现.后者是因为Angular组织结构以及项目构建完全不必要弄得如此繁杂,手写或者在github

理解Angular数据双向绑定_AngularJS

AngularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入等等. 一.什么是数据双向绑定 Angular实现了双向绑定机制.所谓的双向绑定,无非是从界面的操作能实时反映到数据,数据的变更能实时展现到界面. 一个最简单的示例就是这样: <div ng-controller="CounterCtrl"> <span ng-bind="c

由浅入深剖析Angular表单验证_AngularJS

最近手上维护的组件剩下的BUG都是表单验证,而且公司的表单验证那块代码经历的几代人,里面的逻辑开始变得不清晰,而且代码结构不是很angular. 是很有必要深入了解表单验证. <body ng-controller="MainController"> <form name="form" novalidate="novalidate"> <input name="text" type="e

利用CSS3在Angular中实现动画_AngularJS

废话不多说了,直接给大家贴实例代码. 直接看例子: <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ngAnimate插件1</title> <script type=&quo

Angular发布1.5正式版,专注于向Angular 2的过渡_AngularJS

Angular团队最近发布了Angular 1.5的正式版,该版本实现了一次重大的升级,它让仍在使用1.X版本的开发者将能够更容易地过渡到Angular 2的开发. Pete Bacon Darwin在此次发布 声明 的博客文章中写道,这次发布的目的是"改进Angular 2的升级路径.我们在这次发布中引入了一些新的特性,让开发者编写的Angular 1应用更接近于在Angular 2中应用的结构." 此次发布中,新的module.component()辅助方法是向Angular 2进

AngularJS 使用 UI Router 实现表单向导_AngularJS

我们看到这项技术已经应用在了许多的网页上.比如购物车,注册表单,入职流程以及许多多步表单,让用户更容易在线填写表单. 下面我们将构建它:   使用UI Router,它能内嵌状态,为每个状态显示不同的view,我们能让多步表单变得相当的容易. 为了快速的理解UI Router是怎样工作的,看我们的文章:AngularJS使用UI-Router路由 让我们言归正传,开始创建我们的最棒的表单! 创建工程 创建工程有个模板结构. 需要个 布局文件 , 每个表单的视图文件, 格式文件, 以及JavaSc

Eclipse Forms设计漂亮UI之高级组件

高级|设计 Eclipse Forms提供了4个高级组件,这样你能够构建漂亮的UI:expandable composite,section,image hyperlink和form text.让我们依次仔细看看它们每一个. Expandable composite 在网页中有个普遍的功能就是让你有能力把一部分网页内容用一个按钮来伸缩它,Eclipse Forms提供了这样一个组件:ExpandableComposite. ExpandableComposite ec = toolkit.cre

使用AngularJS实现表单向导的方法

这篇文章主要介绍了使用AngularJS实现表单向导的方法,AngularJS是一款高人气JavaScript库,需要的朋友可以参考下     今天我们将使用AngularJs和伟大的UI Router以及Angular ngAnimate module创建一个带动画的多步表单.这项技术可以用在你想要简化用户操作的大表单上. 我们看到这项技术已经应用在了许多的网页上.比如购物车,注册表单,入职流程以及许多多步表单,让用户更容易在线填写表单. 下面我们将构建它: 使用UI Router,它能内嵌状

细说angular Form addControl方法

在本篇博文中,我们将接触angular的验证.angular的验证是由form 指令和ngModel协调完成的.今天博主在这里想要说的是在验证在的一种特殊情况,当验证控件没有没有name属性这是不会被form捕获的.或者是你希望在ngRepeat中使用动态表达式. 下面且让我们先来从angular源码中看起如下: 首先是ngModel: var ngModelDirective = function() { return { require: ['ngModel', '^?form'], con