From 2b5f167b691fad4679048719221b63997b791d45 Mon Sep 17 00:00:00 2001 From: Tasos Bekos Date: Tue, 18 Feb 2014 13:32:23 +0100 Subject: [PATCH] refactor(dropdown): remove isolated scope --- src/dropdown/dropdown.js | 42 ++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/dropdown/dropdown.js b/src/dropdown/dropdown.js index 4dfb4f217c..c7a24bd7db 100644 --- a/src/dropdown/dropdown.js +++ b/src/dropdown/dropdown.js @@ -41,37 +41,55 @@ angular.module('ui.bootstrap.dropdown', []) }; }]) -.controller('DropdownController', ['$scope', '$attrs', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, dropdownConfig, dropdownService, $animate) { - var self = this, openClass = dropdownConfig.openClass; +.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) { + var self = this, + scope = $scope.$new(), // create a child scope so we are not polluting original one + openClass = dropdownConfig.openClass, + getIsOpen, + setIsOpen = angular.noop, + toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop; this.init = function( element ) { self.$element = element; - $scope.isOpen = angular.isDefined($attrs.isOpen) ? $scope.$parent.$eval($attrs.isOpen) : false; + + if ( $attrs.isOpen ) { + getIsOpen = $parse($attrs.isOpen); + setIsOpen = getIsOpen.assign; + + $scope.$watch(getIsOpen, function(value) { + scope.isOpen = !!value; + }); + } }; this.toggle = function( open ) { - return $scope.isOpen = arguments.length ? !!open : !$scope.isOpen; + return scope.isOpen = arguments.length ? !!open : !scope.isOpen; }; // Allow other directives to watch status this.isOpen = function() { - return $scope.isOpen; + return scope.isOpen; }; - $scope.$watch('isOpen', function( value ) { + scope.$watch('isOpen', function( value ) { $animate[value ? 'addClass' : 'removeClass'](self.$element, openClass); if ( value ) { - dropdownService.open( $scope ); + dropdownService.open( scope ); } else { - dropdownService.close( $scope ); + dropdownService.close( scope ); } - $scope.onToggle({ open: !!value }); + setIsOpen($scope, value); + toggleInvoker($scope, { open: !!value }); }); $scope.$on('$locationChangeSuccess', function() { - $scope.isOpen = false; + scope.isOpen = false; + }); + + $scope.$on('$destroy', function() { + scope.$destroy(); }); }]) @@ -79,10 +97,6 @@ angular.module('ui.bootstrap.dropdown', []) return { restrict: 'CA', controller: 'DropdownController', - scope: { - isOpen: '=?', - onToggle: '&' - }, link: function(scope, element, attrs, dropdownCtrl) { dropdownCtrl.init( element ); }