From 537b29d0bbf000fc0639965029983a0f79c03c8f Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 10 Jul 2014 23:48:15 -0600 Subject: [PATCH] fix(toggle): fix ngChange being reported before model changes Closes #1349, #1741 BREAKING CHANGE: ion-toggle no longer has an isolate scope. This will break your toggle only if you were relying upon the toggle having an isolate scope: if you were referencing `$parent.value` as the ng-disabled attribute, for example. Change your code from this: To this: --- js/angular/directive/checkbox.js | 15 +++---- js/angular/directive/toggle.js | 47 +++++++++++----------- test/html/toggle.html | 3 ++ test/unit/angular/directive/toggle.unit.js | 10 ++--- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/js/angular/directive/checkbox.js b/js/angular/directive/checkbox.js index 2fb5208063f..95130aa96ac 100644 --- a/js/angular/directive/checkbox.js +++ b/js/angular/directive/checkbox.js @@ -23,13 +23,14 @@ IonicModule replace: true, require: '?ngModel', transclude: true, - template: '', + template: + '', compile: function(element, attr) { var input = element.find('input'); forEach({ diff --git a/js/angular/directive/toggle.js b/js/angular/directive/toggle.js index 9f8eb0a9802..df94342d042 100644 --- a/js/angular/directive/toggle.js +++ b/js/angular/directive/toggle.js @@ -32,33 +32,34 @@ function($ionicGesture, $timeout) { restrict: 'E', replace: true, require: '?ngModel', - scope: { - ngModel: '=?', - ngValue: '=?', - ngChecked: '=?', - ngChange: '&', - ngDisabled: '=?' - }, transclude: true, - template: '
' + - '
' + - '' + - '
', + template: + '
' + + '
' + + '' + + '
', compile: function(element, attr) { var input = element.find('input'); - if(attr.name) input.attr('name', attr.name); - if(attr.ngChecked) input.attr('ng-checked', 'ngChecked'); - if(attr.ngTrueValue) input.attr('ng-true-value', attr.ngTrueValue); - if(attr.ngFalseValue) input.attr('ng-false-value', attr.ngFalseValue); - if(attr.toggleClass) { - element[0].getElementsByTagName('label')[0].classList.add(attr.toggleClass); - } + forEach({ + 'name': attr.name, + 'ng-value': attr.ngValue, + 'ng-model': attr.ngModel, + 'ng-checked': attr.ngChecked, + 'ng-disabled': attr.ngDisabled, + 'ng-true-value': attr.ngTrueValue, + 'ng-false-value': attr.ngFalseValue, + 'ng-change': attr.ngChange + }, function(value, name) { + if (isDefined(value)) { + input.attr(name, value); + } + }); return function($scope, $element, $attr) { var el, checkbox, track, handle; diff --git a/test/html/toggle.html b/test/html/toggle.html index ed93bcdae2c..97dd862e386 100644 --- a/test/html/toggle.html +++ b/test/html/toggle.html @@ -18,6 +18,9 @@

Toggle

+ + Main Check + Main Check diff --git a/test/unit/angular/directive/toggle.unit.js b/test/unit/angular/directive/toggle.unit.js index 4f1d361fc40..906b5cfa8be 100644 --- a/test/unit/angular/directive/toggle.unit.js +++ b/test/unit/angular/directive/toggle.unit.js @@ -10,16 +10,16 @@ describe('Ionic Toggle', function() { })); it('Should load', function() { - var toggleView = el.isolateScope().toggle; + var toggleView = el.scope().toggle; expect(toggleView).not.toEqual(null); expect(toggleView.checkbox).not.toEqual(null); expect(toggleView.handle).not.toEqual(null); }); it('Should destroy', function() { - var toggleView = el.isolateScope().toggle; + var toggleView = el.scope().toggle; spyOn(toggleView, 'destroy'); - el.isolateScope().$destroy(); + el.scope().$destroy(); expect(toggleView.destroy).toHaveBeenCalled(); }); @@ -31,7 +31,7 @@ describe('Ionic Toggle', function() { // Grab fields var label = el[0].querySelector('label'); - var toggle = el.isolateScope().toggle; + var toggle = el.scope().toggle; var input = el[0].querySelector('input'); // Not disabled, we can toggle @@ -59,7 +59,7 @@ describe('Ionic Toggle', function() { }); it('Should toggle', function() { - var toggle = el.isolateScope().toggle; + var toggle = el.scope().toggle; var label = el[0].querySelector('label'); expect(toggle.val()).toBe(false); ionic.trigger('click', {target: label});