diff --git a/src/buttons/buttons.js b/src/buttons/buttons.js index 5848822c82..c7a62d9332 100644 --- a/src/buttons/buttons.js +++ b/src/buttons/buttons.js @@ -41,21 +41,25 @@ angular.module('ui.bootstrap.buttons', []) require:'ngModel', link:function (scope, element, attrs, ngModelCtrl) { - var trueValue = scope.$eval(attrs.btnCheckboxTrue); - var falseValue = scope.$eval(attrs.btnCheckboxFalse); + function getTrueValue() { + var trueValue = scope.$eval(attrs.btnCheckboxTrue); + return angular.isDefined(trueValue) ? trueValue : true; + } - trueValue = angular.isDefined(trueValue) ? trueValue : true; - falseValue = angular.isDefined(falseValue) ? falseValue : false; + function getFalseValue() { + var falseValue = scope.$eval(attrs.btnCheckboxFalse); + return angular.isDefined(falseValue) ? falseValue : false; + } //model -> UI ngModelCtrl.$render = function () { - element.toggleClass(activeClass, angular.equals(ngModelCtrl.$modelValue, trueValue)); + element.toggleClass(activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); }; //ui->model element.bind(toggleEvent, function () { scope.$apply(function () { - ngModelCtrl.$setViewValue(element.hasClass(activeClass) ? falseValue : trueValue); + ngModelCtrl.$setViewValue(element.hasClass(activeClass) ? getFalseValue() : getTrueValue()); ngModelCtrl.$render(); }); }); diff --git a/src/buttons/test/buttons.spec.js b/src/buttons/test/buttons.spec.js index b7ee29d26c..8fbfa1501e 100644 --- a/src/buttons/test/buttons.spec.js +++ b/src/buttons/test/buttons.spec.js @@ -63,6 +63,23 @@ describe('buttons', function () { expect($scope.model).toEqual(0); expect(btn).not.toHaveClass('active'); }); + + it('should monitor true / false value changes - issue 666', function () { + + $scope.model = 1; + $scope.trueVal = 1; + var btn = compileButton('', $scope); + + expect(btn).toHaveClass('active'); + expect($scope.model).toEqual(1); + + $scope.model = 2; + $scope.trueVal = 2; + $scope.$digest(); + + expect(btn).toHaveClass('active'); + expect($scope.model).toEqual(2); + }); }); describe('radio', function () {