diff options
| author | Lucas Galfasó | 2013-02-06 10:08:40 -0300 | 
|---|---|---|
| committer | Igor Minar | 2013-02-14 19:55:05 -0800 | 
| commit | 0af172040e03811c59d01682968241e3df226774 (patch) | |
| tree | c1779a7708686c472f598e034a8cec791296782f /src/ng/directive/ngSwitch.js | |
| parent | e19b04c9ec985821edf1269c628cfa261f81d631 (diff) | |
| download | angular.js-0af172040e03811c59d01682968241e3df226774.tar.bz2 | |
feat(ngSwitch): support multiple matches on ngSwitchWhen and ngSwitchDefault
Closes #1074
Diffstat (limited to 'src/ng/directive/ngSwitch.js')
| -rw-r--r-- | src/ng/directive/ngSwitch.js | 43 | 
1 files changed, 27 insertions, 16 deletions
| diff --git a/src/ng/directive/ngSwitch.js b/src/ng/directive/ngSwitch.js index 7b698107..aa04a998 100644 --- a/src/ng/directive/ngSwitch.js +++ b/src/ng/directive/ngSwitch.js @@ -20,8 +20,11 @@   * On child elments add:   *   * * `ngSwitchWhen`: the case statement to match against. If match then this - *   case will be displayed. - * * `ngSwitchDefault`: the default case when no other casses match. + *   case will be displayed. If the same match appears multiple times, all the + *   elements will be displayed. + * * `ngSwitchDefault`: the default case when no other case match. If there + *   are multiple default cases, all of them will be displayed when no other + *   case match.   *   * @example      <doc:example> @@ -69,22 +72,28 @@ var ngSwitchDirective = valueFn({    }],    link: function(scope, element, attr, ctrl) {      var watchExpr = attr.ngSwitch || attr.on, -        selectedTransclude, -        selectedElement, -        selectedScope; +        selectedTranscludes, +        selectedElements, +        selectedScopes = [];      scope.$watch(watchExpr, function ngSwitchWatchAction(value) { -      if (selectedElement) { -        selectedScope.$destroy(); -        selectedElement.remove(); -        selectedElement = selectedScope = null; +      for (var i= 0, ii=selectedScopes.length; i<ii; i++) { +        selectedScopes[i].$destroy(); +        selectedElements[i].remove();        } -      if ((selectedTransclude = ctrl.cases['!' + value] || ctrl.cases['?'])) { + +      selectedElements = []; +      selectedScopes = []; + +      if ((selectedTranscludes = ctrl.cases['!' + value] || ctrl.cases['?'])) {          scope.$eval(attr.change); -        selectedScope = scope.$new(); -        selectedTransclude(selectedScope, function(caseElement) { -          selectedElement = caseElement; -          element.append(caseElement); +        forEach(selectedTranscludes, function(selectedTransclude) { +          var selectedScope = scope.$new(); +          selectedScopes.push(selectedScope); +          selectedTransclude(selectedScope, function(caseElement) { +            selectedElements.push(caseElement); +            element.append(caseElement); +          });          });        }      }); @@ -97,7 +106,8 @@ var ngSwitchWhenDirective = ngDirective({    require: '^ngSwitch',    compile: function(element, attrs, transclude) {      return function(scope, element, attr, ctrl) { -      ctrl.cases['!' + attrs.ngSwitchWhen] = transclude; +      ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []); +      ctrl.cases['!' + attrs.ngSwitchWhen].push(transclude);      };    }  }); @@ -108,7 +118,8 @@ var ngSwitchDefaultDirective = ngDirective({    require: '^ngSwitch',    compile: function(element, attrs, transclude) {      return function(scope, element, attr, ctrl) { -      ctrl.cases['?'] = transclude; +      ctrl.cases['?'] = (ctrl.cases['?'] || []); +      ctrl.cases['?'].push(transclude);      };    }  }); | 
