@@ -294,26 +294,29 @@ class InputCheckbox {
294294 final NgModel ngModel;
295295 final NgTrueValue ngTrueValue;
296296 final NgFalseValue ngFalseValue;
297+ final NgModelOptions ngModelOptions;
297298 final Scope scope;
298299
299300 InputCheckbox (dom.Element this .inputElement, this .ngModel,
300- this .scope, this .ngTrueValue, this .ngFalseValue) {
301+ this .scope, this .ngTrueValue, this .ngFalseValue, this .ngModelOptions ) {
301302 ngModel.render = (value) {
302303 scope.rootScope.domWrite (() {
303304 inputElement.checked = ngTrueValue.isValue (value);
304305 });
305306 };
306307 inputElement
307- ..onChange.listen ((_) {
308- ngModel.viewValue = inputElement.checked
309- ? ngTrueValue.value : ngFalseValue.value;
310- })
311- ..onBlur.listen ((e) {
308+ ..onChange.listen ((_) => ngModelOptions.executeChangeFunc (() {
309+ ngModel.viewValue = inputElement.checked ? ngTrueValue.value : ngFalseValue.value;
310+ }))
311+ ..onBlur.listen ((_) => ngModelOptions.executeBlurFunc (() {
312312 ngModel.markAsTouched ();
313- });
313+ })) ;
314314 }
315315}
316316
317+
318+
319+
317320/**
318321 * Usage:
319322 *
@@ -337,37 +340,42 @@ class InputCheckbox {
337340class InputTextLike {
338341 final dom.Element inputElement;
339342 final NgModel ngModel;
343+ final NgModelOptions ngModelOptions;
340344 final Scope scope;
341345 String _inputType;
342346
347+
343348 get typedValue => (inputElement as dynamic ).value;
344349 void set typedValue (value) {
345350 (inputElement as dynamic ).value = (value == null ) ? '' : value.toString ();
346351 }
347352
348- InputTextLike (this .inputElement, this .ngModel, this .scope) {
353+ InputTextLike (this .inputElement, this .ngModel, this .scope, this .ngModelOptions ) {
349354 ngModel.render = (value) {
350355 scope.rootScope.domWrite (() {
351356 if (value == null ) value = '' ;
352357
353358 var currentValue = typedValue;
354359 if (value != currentValue && ! (value is num && currentValue is num &&
355360 value.isNaN && currentValue.isNaN)) {
356- typedValue = value;
361+ typedValue = value;
357362 }
358363 });
359364 };
365+
360366 inputElement
361- ..onChange.listen (processValue)
362- ..onInput.listen (processValue)
363- ..onBlur.listen ((e ) {
367+ ..onChange.listen ((event) => ngModelOptions. executeChangeFunc (() => processValue (event)) )
368+ ..onInput.listen ((event) => ngModelOptions. executeInputFunc (() => processValue (event)) )
369+ ..onBlur.listen ((_) => ngModelOptions. executeBlurFunc (( ) {
364370 ngModel.markAsTouched ();
365- });
371+ })) ;
366372 }
367373
368374 void processValue ([_]) {
369375 var value = typedValue;
376+
370377 if (value != ngModel.viewValue) ngModel.viewValue = value;
378+
371379 ngModel.validate ();
372380 }
373381}
@@ -394,6 +402,7 @@ class InputTextLike {
394402class InputNumberLike {
395403 final dom.InputElement inputElement;
396404 final NgModel ngModel;
405+ final NgModelOptions ngModelOptions;
397406 final Scope scope;
398407
399408
@@ -414,7 +423,7 @@ class InputNumberLike {
414423 }
415424 }
416425
417- InputNumberLike (dom.Element this .inputElement, this .ngModel, this .scope) {
426+ InputNumberLike (dom.Element this .inputElement, this .ngModel, this .scope, this .ngModelOptions ) {
418427 ngModel.render = (value) {
419428 scope.rootScope.domWrite (() {
420429 if (value != typedValue
@@ -424,11 +433,11 @@ class InputNumberLike {
424433 });
425434 };
426435 inputElement
427- ..onChange.listen (relaxFnArgs ( processValue))
428- ..onInput.listen (relaxFnArgs ( processValue))
429- ..onBlur.listen ((e ) {
436+ ..onChange.listen ((event) => ngModelOptions. executeChangeFunc (() => processValue () ))
437+ ..onInput.listen ((event) => ngModelOptions. executeInputFunc (() => processValue () ))
438+ ..onBlur.listen ((_) => ngModelOptions. executeBlurFunc (( ) {
430439 ngModel.markAsTouched ();
431- });
440+ })) ;
432441 }
433442
434443 void processValue () {
@@ -586,11 +595,12 @@ class InputDateLike {
586595 toFactory: (Injector i) => new NgBindTypeForDateLike (i.get (dom.Element )));
587596 final dom.InputElement inputElement;
588597 final NgModel ngModel;
598+ final NgModelOptions ngModelOptions;
589599 final Scope scope;
590600 NgBindTypeForDateLike ngBindType;
591601
592602 InputDateLike (dom.Element this .inputElement, this .ngModel, this .scope,
593- this .ngBindType) {
603+ this .ngBindType, this .ngModelOptions ) {
594604 if (inputElement.type == 'datetime-local' ) {
595605 ngBindType.idlAttrKind = NgBindTypeForDateLike .NUMBER ;
596606 }
@@ -600,11 +610,11 @@ class InputDateLike {
600610 });
601611 };
602612 inputElement
603- ..onChange.listen (relaxFnArgs ( processValue))
604- ..onInput.listen (relaxFnArgs ( processValue))
605- ..onBlur.listen ((e ) {
613+ ..onChange.listen ((event) => ngModelOptions. executeChangeFunc (() => processValue () ))
614+ ..onInput.listen ((event) => ngModelOptions. executeInputFunc (() => processValue () ))
615+ ..onBlur.listen ((_) => ngModelOptions. executeBlurFunc (( ) {
606616 ngModel.markAsTouched ();
607- });
617+ })) ;
608618 }
609619
610620 dynamic get typedValue => ngBindType.inputTypedValue;
@@ -680,7 +690,9 @@ class NgValue {
680690 NgValue (this .element);
681691
682692 @NgOneWay ('ng-value' )
683- void set value (val) { this ._value = val; }
693+ void set value (val) {
694+ this ._value = val;
695+ }
684696 dynamic get value => _value == null ? (element as dynamic ).value : _value;
685697}
686698
@@ -767,7 +779,7 @@ class InputRadio {
767779 ..onClick.listen ((_) {
768780 if (radioButtonElement.checked) ngModel.viewValue = ngValue.value;
769781 })
770- ..onBlur.listen ((e ) {
782+ ..onBlur.listen ((event ) {
771783 ngModel.markAsTouched ();
772784 });
773785 }
@@ -785,8 +797,8 @@ class InputRadio {
785797 */
786798@Decorator (selector: '[contenteditable][ng-model]' )
787799class ContentEditable extends InputTextLike {
788- ContentEditable (dom.Element inputElement, NgModel ngModel, Scope scope)
789- : super (inputElement, ngModel, scope);
800+ ContentEditable (dom.Element inputElement, NgModel ngModel, Scope scope, NgModelOptions modelOptions )
801+ : super (inputElement, ngModel, scope, modelOptions );
790802
791803 // The implementation is identical to InputTextLike but use innerHtml instead of value
792804 String get typedValue => (inputElement as dynamic ).innerHtml;
0 commit comments