@@ -294,26 +294,29 @@ class InputCheckbox {
294
294
final NgModel ngModel;
295
295
final NgTrueValue ngTrueValue;
296
296
final NgFalseValue ngFalseValue;
297
+ final NgModelOptions ngModelOptions;
297
298
final Scope scope;
298
299
299
300
InputCheckbox (dom.Element this .inputElement, this .ngModel,
300
- this .scope, this .ngTrueValue, this .ngFalseValue) {
301
+ this .scope, this .ngTrueValue, this .ngFalseValue, this .ngModelOptions ) {
301
302
ngModel.render = (value) {
302
303
scope.rootScope.domWrite (() {
303
304
inputElement.checked = ngTrueValue.isValue (value);
304
305
});
305
306
};
306
307
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 (() {
312
312
ngModel.markAsTouched ();
313
- });
313
+ })) ;
314
314
}
315
315
}
316
316
317
+
318
+
319
+
317
320
/**
318
321
* Usage:
319
322
*
@@ -337,37 +340,42 @@ class InputCheckbox {
337
340
class InputTextLike {
338
341
final dom.Element inputElement;
339
342
final NgModel ngModel;
343
+ final NgModelOptions ngModelOptions;
340
344
final Scope scope;
341
345
String _inputType;
342
346
347
+
343
348
get typedValue => (inputElement as dynamic ).value;
344
349
void set typedValue (value) {
345
350
(inputElement as dynamic ).value = (value == null ) ? '' : value.toString ();
346
351
}
347
352
348
- InputTextLike (this .inputElement, this .ngModel, this .scope) {
353
+ InputTextLike (this .inputElement, this .ngModel, this .scope, this .ngModelOptions ) {
349
354
ngModel.render = (value) {
350
355
scope.rootScope.domWrite (() {
351
356
if (value == null ) value = '' ;
352
357
353
358
var currentValue = typedValue;
354
359
if (value != currentValue && ! (value is num && currentValue is num &&
355
360
value.isNaN && currentValue.isNaN)) {
356
- typedValue = value;
361
+ typedValue = value;
357
362
}
358
363
});
359
364
};
365
+
360
366
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 (() => ( ) {
364
370
ngModel.markAsTouched ();
365
- });
371
+ })) ;
366
372
}
367
373
368
374
void processValue ([_]) {
369
375
var value = typedValue;
376
+
370
377
if (value != ngModel.viewValue) ngModel.viewValue = value;
378
+
371
379
ngModel.validate ();
372
380
}
373
381
}
@@ -394,6 +402,7 @@ class InputTextLike {
394
402
class InputNumberLike {
395
403
final dom.InputElement inputElement;
396
404
final NgModel ngModel;
405
+ final NgModelOptions ngModelOptions;
397
406
final Scope scope;
398
407
399
408
@@ -414,21 +423,20 @@ class InputNumberLike {
414
423
}
415
424
}
416
425
417
- InputNumberLike (dom.Element this .inputElement, this .ngModel, this .scope) {
426
+ InputNumberLike (dom.Element this .inputElement, this .ngModel, this .scope, this .ngModelOptions ) {
418
427
ngModel.render = (value) {
419
428
scope.rootScope.domWrite (() {
420
- if (value != typedValue
421
- && (value == null || value is num && ! value.isNaN)) {
429
+ if (value != typedValue && (value == null || value is num && ! value.isNaN)) {
422
430
typedValue = value;
423
431
}
424
432
});
425
433
};
426
434
inputElement
427
- ..onChange.listen (relaxFnArgs ( processValue))
428
- ..onInput.listen (relaxFnArgs ( processValue))
429
- ..onBlur.listen ((e ) {
435
+ ..onChange.listen ((event) => ngModelOptions. executeChangeFunc (() => processValue () ))
436
+ ..onInput.listen ((event) => ngModelOptions. executeInputFunc (() => processValue () ))
437
+ ..onBlur.listen ((event) => ngModelOptions. executeBlurFunc (() => ( ) {
430
438
ngModel.markAsTouched ();
431
- });
439
+ })) ;
432
440
}
433
441
434
442
void processValue () {
@@ -586,11 +594,12 @@ class InputDateLike {
586
594
toFactory: (Injector i) => new NgBindTypeForDateLike (i.get (dom.Element )));
587
595
final dom.InputElement inputElement;
588
596
final NgModel ngModel;
597
+ final NgModelOptions ngModelOptions;
589
598
final Scope scope;
590
599
NgBindTypeForDateLike ngBindType;
591
600
592
601
InputDateLike (dom.Element this .inputElement, this .ngModel, this .scope,
593
- this .ngBindType) {
602
+ this .ngBindType, this .ngModelOptions ) {
594
603
if (inputElement.type == 'datetime-local' ) {
595
604
ngBindType.idlAttrKind = NgBindTypeForDateLike .NUMBER ;
596
605
}
@@ -600,11 +609,11 @@ class InputDateLike {
600
609
});
601
610
};
602
611
inputElement
603
- ..onChange.listen (relaxFnArgs ( processValue))
604
- ..onInput.listen (relaxFnArgs ( processValue))
605
- ..onBlur.listen ((e ) {
612
+ ..onChange.listen ((event) => ngModelOptions. executeChangeFunc (() => processValue () ))
613
+ ..onInput.listen ((event) => ngModelOptions. executeInputFunc (() => processValue () ))
614
+ ..onBlur.listen ((_) => ngModelOptions. executeBlurFunc (() => ( ) {
606
615
ngModel.markAsTouched ();
607
- });
616
+ })) ;
608
617
}
609
618
610
619
dynamic get typedValue => ngBindType.inputTypedValue;
@@ -680,7 +689,9 @@ class NgValue {
680
689
NgValue (this .element);
681
690
682
691
@NgOneWay ('ng-value' )
683
- void set value (val) { this ._value = val; }
692
+ void set value (val) {
693
+ this ._value = val;
694
+ }
684
695
dynamic get value => _value == null ? (element as dynamic ).value : _value;
685
696
}
686
697
@@ -785,8 +796,8 @@ class InputRadio {
785
796
*/
786
797
@Decorator (selector: '[contenteditable][ng-model]' )
787
798
class ContentEditable extends InputTextLike {
788
- ContentEditable (dom.Element inputElement, NgModel ngModel, Scope scope)
789
- : super (inputElement, ngModel, scope);
799
+ ContentEditable (dom.Element inputElement, NgModel ngModel, Scope scope, NgModelOptions modelOptions )
800
+ : super (inputElement, ngModel, scope, modelOptions );
790
801
791
802
// The implementation is identical to InputTextLike but use innerHtml instead of value
792
803
String get typedValue => (inputElement as dynamic ).innerHtml;
0 commit comments