/** * Created by NICK on 15/7/28. * email:nick121212@126.com * qq:289412378 * copyright NICK */ import ref = require('ref'); class base { public static PRISTINE_CLASS:string = 'ng-pristine'; public static DIRTY_CLASS:string = 'ng-dirty'; static arrayRemove(array:Array, value:any) { var index = base.indexOf(array, value); if (index >= 0) array.splice(index, 1); return value; } static indexOf(array:Array, obj:any) { if (array.indexOf) return array.indexOf(obj); for (var i = 0; i < array.length; i++) { if (obj === array[i]) return i; } return -1; } static createDir(isNgForm):Array { var directive:ng.IDirective = {}; directive.restrict = 'E'; directive.require = ['form']; directive.compile = ()=> { return { pre: (scope, element, attrs, ctrls)=> { var form = ctrls[0], $addControl = form.$addControl, $removeControl = form.$removeControl, controls = []; form.$addControl = function (control) { controls.push(control); $addControl.apply(this, arguments); }; form.$removeControl = function (control) { base.arrayRemove(controls, control); $removeControl.apply(this, arguments); }; form.$setPristine = function () { element.removeClass(base.DIRTY_CLASS).addClass(base.PRISTINE_CLASS); form.$dirty = false; form.$pristine = true; angular.forEach(controls, function (control) { control.$setPristine(); }); }; } }; }; return [()=> { return isNgForm ? angular.extend(angular.copy(directive), {restrict: 'EAC'}) : directive; }]; } } export class NgFormDirective { public static _name = 'ngForm'; public static directive:Array = base.createDir(true); } export class FormDirective { public static _name = 'form'; public static directive:Array = base.createDir(false); } export class NgModelDirective { public static _name = 'ngModel'; public static directive:Array = [()=> { var directive:ng.IDirective = {}; directive.require = ['ngModel']; directive.link = (scope, element, attrs, ctrls)=> { var control = ctrls[0]; control.$setPristine = function () { this.$dirty = false; this.$pristine = true; element.removeClass(base.DIRTY_CLASS).addClass(base.PRISTINE_CLASS); } }; return directive; }]; }