diff --git a/lib/directive/ng_model.dart b/lib/directive/ng_model.dart index 1ac6f9dce..7621a0c2e 100644 --- a/lib/directive/ng_model.dart +++ b/lib/directive/ng_model.dart @@ -141,6 +141,7 @@ class InputCheckboxDirective { }; inputElement.onChange.listen((value) { scope.$apply(() { + ngModel.dirty = true; ngModel.viewValue = inputElement.checked ? ngTrueValue.readValue(inputElement) : ngFalseValue.readValue(inputElement); @@ -389,6 +390,7 @@ class InputRadioDirective { }; radioButtonElement.onClick.listen((_) { if (radioButtonElement.checked) { + ngModel.dirty = true; scope.$apply(() => ngModel.viewValue = ngValue.readValue(radioButtonElement)); } }); diff --git a/test/directive/ng_model_spec.dart b/test/directive/ng_model_spec.dart index ce1ea6106..25180c097 100644 --- a/test/directive/ng_model_spec.dart +++ b/test/directive/ng_model_spec.dart @@ -458,6 +458,20 @@ describe('ng-model', () { expect(element.checked).toBe(false); })); + it('should render as dirty when checked', inject((Scope scope) { + var element = _.compile(''); + Probe probe = _.rootScope.i; + var model = probe.directive(NgModel); + + expect(model.pristine).toEqual(true); + expect(model.dirty).toEqual(false); + + _.triggerEvent(element, 'change'); + + expect(model.pristine).toEqual(false); + expect(model.dirty).toEqual(true); + })); + it('should update input value from model using ng-true-value/false', inject((Scope scope) { var element = _.compile(''); @@ -679,6 +693,44 @@ describe('ng-model', () { expect(greenBtn.checked).toBe(true); expect(blueBtn.checked).toBe(false); }); + + it('should render as dirty when checked', inject((Scope scope) { + var element = _.compile( + '