Avoid bloating your templates with repetitive form html.
Instead, just specify a schema for the form and the model you want to bind it to and you're done!
Check out a demo & documentation
install-package AngularJs.AutoFields.Bootstrap
<script type="text/javascript" src="js/autofields.js"></script>
<!-- with bootstrap -->
<script type="text/javascript" src="js/autofields-bootstrap.js"></script>
- If you're doing this manually and using bootstrap, be sure to install Angular-UI Bootstrap for date popover support
- Include the
autofields.js
script provided by this component into your app. If you are using bootstrap, also includeautofields-bootstrap.js
- add
autofields
as a module dependency to your app
angular.module('app',['autofields'])
.controller('JoinCtrl', ['$scope', function ($scope) {
$scope.user = {
username: '',
password: '',
confirmPassword: '',
};
$scope.schema = [
{ property: 'username', type: 'text', attr: { ngMinlength: 4, required: true }, msgs: {minlength: 'Needs to have at least 4 characters'} },
{ property: 'password', type: 'password', attr: { required: true } },
{ property: 'confirmPassword', label: 'Confirm Password', type: 'password', attr: { confirmPassword: 'user.password', required: true } }
];
$scope.join = function(){
if(!$scope.joinForm.$valid) return;
//join stuff....
}
}]);
<form name="joinForm" ng-submit="join()">
<auto:fields fields="schema" data="user"></auto:fields>
<button type="submit" class="btn btn-default btn-lg btn-block" ng-class="{'btn-primary':joinForm.$valid}">Join</button>
</form>
property
the data property to bind totype
the type of field. Options include: checkbox, date, select, textarea, any text variation (ie. password, text, email, number)label
the label for the field. If no label is provided it will convert the property name to title case. If you don't want a label, set it's value to ''placeholder
the placeholder for the field. If no placeholder is provided it will use the label. If you don't want a placeholder, set it's value to ''help
a block of help or description text to be displayed beneath the fieldattr
any additional attributes you would like to have on the object. Camelcase is converted to dash notation. Validation properties can go here.list
the string that goes into ng-options for select fieldsrows
number of textarea rows (default: 3)columns
number of sm columns a field should span if the type is multiple. If this is applied at the same level as the multiple type, it will apply it to all of it's fields.msgs
validation messages for corresponding validation properties on the fieldvalidate
enable/disable validation for the field (default: true)addons
array of addon objects to be included with the inputbutton
is a button (default: false)icon
class string for an icon to include, empty or null implies no iconcontent
string to be placed in the addonbefore
prepend the addon (default: false)
classes
object with an array of classes for each element of a field group: container, input, labelattributes
object with default attribute-value pairs for each element of a field group: container, input, labeldisplayAttributes
array of attributes that affect field displaycontainer
the html for the div the will hold the fieldstextareaRows
the default amount of rows for a textarea (3)fixUrl
whether or not url type fields should have http:// auto added (true)
validation
settings for validationenabled
enabled/disable validation (enabled by default)showMessages
enabled/disable validation messages (enabled by default)defaultMsgs
default validation messages when none is specified in the field schema
####With Bootstrap
classes
adds 8 new element class arrays: row, col, colOffset, helpBlock, inputGroup, inputGroupAddon, inputGroupAddonButton, buttonlayout
layout options for the fieldstype
form type:basic | horizontal
labelSize
how many columns a label should spaninputSize
how many columns an input should span
defaultOption
the text for the default select option (Select One)dateSettings
settings for the date fields (see angular-ui-bootstrap's date picker)datepickerOptions
settings for the date picker (see angular-ui-bootstrap's date picker)
AutoFields is now highly extensible allowing developer to easily add new field types and field properties.
types
a string or array of strings with field types that will be used to map to the handlerhandler
a function that will be called by AutoFields to create the fields html. AutoFields will pass directive, field, and field indexdirective
directive properties, options, and elements:container
the autofields container elementoptions
the options for the directive
field
the field schema currently being processedindex
the index of the field in the field schema array
module('autofields.checkbox', ['autofields.core'])
.config(['$autofieldsProvider', function($autofieldsProvider){
// Checkbox Field Handler
$autofieldsProvider.registerHandler('checkbox', function(directive, field, index){
var fieldElements = $autofieldsProvider.field(directive, field, '<input/>');
if(fieldElements.label) fieldElements.label.prepend(fieldElements.input);
return fieldElements.fieldContainer;
});
}]);
key
something the mutator can be referenced by in require & override requestsmutator
called by autofields after the creation of a field elementdirective
container
the autofields container elementoptions
the options for the directive
field
the field schema currently being processedfieldElements
an object containing:fieldContainer
the container element for the field's label and inputlabel
the label elementinput
the input elementvalidation
whether or not to include validation requires validationmsgs
an array of possible error messages requires validationvalidMsg
a field's valid message requires validation
module('autofields.helpblock', ['autofields.core'])
.config(['$autofieldsProvider', function($autofieldsProvider){
// Help Block Propert Support
$autofieldsProvider.registerMutator('helpBlock', function(directive, field, fieldElements){
if(!field.help) return fieldElements;
fieldElements.helpBlock = angular.element('<p/>');
fieldElements.helpBlock.addClass(directive.options.classes.helpBlock.join(' '))
fieldElements.helpBlock.html(field.help);
fieldElements.fieldContainer.append(fieldElements.helpBlock);
return fieldElements;
});
}]);
- It shares the scope of it's parent so that it can access the data on the scope
- To make it work on IE8, just add a polyfill for Array.isArray()