<!DOCTYPE html>
<html>
<head>
<script src="https://code.angularjs.org/tools/system.js"></script>
<script src="https://code.angularjs.org/tools/typescript.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.15/angular2-polyfills.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.15/angular2.dev.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.15/router.dev.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.15/http.dev.js"></script>
<script src="https://code.angularjs.org/2.0.0-beta.15/Rx.js"></script>
<script src="config.js"></script>
<script src="https://npmcdn.com/ionic-angular@2.0.0-beta.6/bundles/ionic.system.js"></script>
<link href="https://npmcdn.com/ionic-angular@2.0.0-beta.6/bundles/ionic.ios.css" rel="stylesheet">
<link href="style.css" rel="stylesheet">
</head>
<body>
<!-- this Ionic's root component and where the app will load -->
<ion-app></ion-app>
<script>
System.import('app.ts')
</script>
</body>
</html>
import { App, Platform } from 'ionic-angular/index';
import { TestPage } from './test.ts';
@App({
template: '<ion-nav [root]="rootPage"></ion-nav>',
config: {} // http://ionicframework.com/docs/v2/api/config/Config/
})
export class MyApp {
constructor(private platform: Platform) {
this.rootPage = TestPage;
}
}
/* Styles go here */
System.config({
transpiler: 'typescript',
typescriptOptions: {
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
//"module": "commonjs",
//"target": "es6"
}
});
import { Page } from 'ionic-angular/index';
import { ControlGroup, FormBuilder, FORM_DIRECTIVES, Validators } from 'angular2/common';
import { OnInit } from 'angular2/core';
import { IdNumAccessor } from './id-num-accessor.ts';
@Page({
template: `
<ion-content>
<form novalidate
[ngFormModel]="form"
(ngSubmit)="onSubmit()">
<ion-input placeholder="ion test" type="tel"
agl-id-num
[ngFormControl]="form.controls['ionTest']">
</ion-input>
<input placeholder="pure test" type="tel"
agl-id-num
[ngFormControl]="form.controls['pureTest']" />
<button block type="submit">
Submit
</button>
</form>
<p>ionTest: {{form.value.ionTest}}</p>
<p>pureTest: {{form.value.pureTest}}</p>
</ion-content>
`,
directives: [ FORM_DIRECTIVES, IdNumAccessor ]
})
export class TestPage implements OnInit {
form: ControlGroup;
constructor(private fb: FormBuilder) { }
ngOnInit() {
this.form = this.fb.group({
'ionTest': ['', Validators.required],
'pureTest': ['', Validators.required]
});
}
onSubmit() {
console.log(form.value);
}
}
import { DefaultValueAccessor, NG_VALUE_ACCESSOR } from 'angular2/common';
import { Directive, ElementRef, forwardRef, Provider, Renderer } from 'angular2/core';
const CUSTOM_VALUE_ACCESSOR = new Provider(
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => IdNumAccessor), multi: true});
@Directive ({
selector: '[agl-id-num]',
host: {
'(input)': 'doOnChange($event.target)',
'(blur)': 'doOnBlur($event.target)'
},
bindings: [ CUSTOM_VALUE_ACCESSOR ]
})
export class IdNumAccessor extends DefaultValueAccessor {
onChange = (_: any) => {};
onTouched = () => {};
constructor(_renderer: Renderer, _elementRef: ElementRef) {
super(_renderer, _elementRef);
}
writeValue(value:any):void {
if (value!=null) {
super.writeValue(value);
}
}
doOnChange(elt) {
// prevent user to input non-digit characters while typing
// and limit user input to 14 characters
let val = elt.value
.replace(/\D/g, '')
.substring(0,14);
// update interface
elt.value = val;
// change model
this.onChange(val);
}
doOnBlur(elt) {
// format field on blur
let val = elt.value + '';
if (val.length === 11) {
elt.value = val.replace(/^(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4');
}
else if (val.length = 14) {
elt.value = val.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, '$1.$2.$3/$4-$5');
}
}
}