Directive input element name (formController)
Setting the name on an input element so that can show validation errors.
HTML
<script src="http://ci.angularjs.org/job/angular.js-angular-master/ws/build/angular.min.js"></script>
<p>Testing Setting of the name on an element</p>
<hr/>
<div ng-app="interfaceSettings" ng-controller="TestDirective">
<ul>
<li><b>AngularVersion:</b> {{settings.angularVersion.full}}</li>
<li><b>ServerType:</b> {{settings.serverType}}</li>
<li><b>ServerName:</b> {{settings.serverName}}</li>
<li><b>ServerCity:</b> {{settings.serverCity}}</li>
</ul>
<hr/>
<div id="validationError" style="display:none;" class="alert_box error" ng-show="settingsForm.$invalid">
<b style="color:red;">There Were Errors:</b><br/>
<ul>
<li ng-show="settingsForm.serverName.$error.required"><b>Required: </b> ServerName</li>
<li ng-show="settingsForm.serverName.$error.pattern"><b>Pattern: </b> ServerName</li>
<li ng-show="settingsForm.serverType.$error.required"><b>Required: </b> ServerType</li>
<li ng-show="settingsForm.serverCity.$error.required"><b>Required: </b> ServerCity</li>
</ul>
</div>
<hr/>
<form name="settingsForm">
<div class="formEntry"><label>1. Server Name</label> <input type="text" ng-model="settings.serverName" name="serverName" required/></div>
<ei-text-field model="settings.serverType" label="2. Server Type" field-name="serverType" description="My Field Description" required="true"></ei-text-field>
<ei-text-field model="settings.serverCity" label="3. Server City" field-name="serverCity" description="City" required="true"></ei-text-field>
</form>
</div>
CSS
body {
padding: 10px;
font-family: sans-serif;
font-size: 0.9em;
}
form label {font-weight:bold;margin-right:10px;font-size:0.9em;}
form label:after {content:':';}
input.ng-invalid, select.ng-invalid, textarea.ng-invalid, input.formElement.ng-invalid {
border: solid 1pt red;
}
div.formEntry {
margin-bottom:5px;padding-bottom:10px;border-bottom:solid 1px #eee;
}
JavaScript
var settingsModule = angular.module('interfaceSettings', []);
settingsModule.directive('eiTextField', function() {
return {
restrict: 'E',
replace: 'false',
require: '?form',
transclude: true,
scope: {
model: 'accessor',
description: 'attribute',
label: 'attribute',
fieldName: 'attribute',
required: 'evaluate'
},
template: '<div class="formEntry"><label>{{label}}</label><input type="text" name="tmpElement" ng-model="localModel" class="formElement" ng-required="true"/></div>',
link: function(scope, element, attrs, controller) {
var tmpElementName = "tmpElement"
var formCtrl = (controller != null) ? controller : element.parent().controller('form');
// Setup the local model to bind.
scope.localModel = scope.model();
// Rename the element.
var currentElement = element.find('input');
if (currentElement) {
currentElement.attr('name', attrs['fieldName']);
}
// Grab the control already registered under bogus name.
// Remove control, change name, replace. This gives the
// validator the correct form elements.
var currentElementCtrl = formCtrl[tmpElementName];
formCtrl.$removeControl(currentElementCtrl);
currentElementCtrl.$name = attrs['fieldName'];
formCtrl.$addControl(currentElementCtrl);
// Setup the binding on the model.
scope.$watch('localModel', function(value) {
scope.model(value);
});
scope.$watch(
function() {return scope.model()},
function(value) {scope.localModel = value;}
);
}
};
});
function TestDirective($scope) {
$scope.settings = {
angularVersion:...