Zu Demozwecken wird eine einfache Input Spinner Component als Custom Form Control realisiert.
Diese soll einen Startwert erhalten, welcher duch Buttons hoch- und runtergezählt werden kann.
Durch die Zuweisen von ngModel erhält man innerhalb des Custom Form Control den vollen Zugriff auf das AngularJs ngModel.
Damit es klar ist, dass hier mit dem Model mehr als nur Two Way Binding stattfindet, wird es in ngModelCtrl umbenannt.
Hierfür wird das require der Component-Options entsprechend gesetzt:
...
require: { ngModelCtrl: 'ngModel' },
...
Die Spinner Component soll intern ein Input vom Type number nutzen.
Dessen ng-model wird auf den Wert von ngModelCtrl.$viewValue gesetzt.
<input
type="number"
ng-model="$ctrl.ngModelCtrl.$viewValue"
/>
Im weitern Verlauf wird mittels GET und SET value auf $viewValue zugegriffen und zugewiesen.
...
get value() {
return +this.ngModelCtrl.$viewValue;
}
set value(value) {
this.ngModelCtrl.$setViewValue(value);
}
...
Nun werden Buttons definiert, die für das Hoch- und Runterzählen gelten.
<button ng-click="$ctrl.decrement()">
decrement
</button>
<input
type="number"
ng-model="$ctrl.ngModelCtrl.$viewValue"
/>
<button ng-click="$ctrl.increment()">
increment
</button>
Zu Demozwecken wird der Wert um 1 hoch- oder entsprechend runtergezählt.
increment() {
this.value = this.value + 1;
}
decrement() {
this.value = this.value - 1;
}
Durch die Zuweisung von ngModel kann das Custom Form Control auch einfach in einem AngularJs Form (hier: $ctrl.f) genutzt werden.
Hierfür wird das Name-Attribute gesetzt.
Somit lässt sich das Custom Form Control mittels $ctrl.f.submit() validieren und dessen Wert im Formular abfragen/bearbeiten.
<form name="$ctrl.f">
<spinner
name="spinner"
ng-model="$ctrl.spinnerControlValue"
></spinner>
<button ng-click="$ctrl.f.submit()">submit form</button>
</form>
<h3>Form as JSON</h3>
<pre>{{ $ctrl.f | json }}</pre>
Das Custom Form Control kann nun durch weitere Component Bindings erweitert werden.
z.B.:
Ersteller der Webseite MuchaDev. Selbstständiger IT Constultant für Frontend Technologien.