aboutsummaryrefslogtreecommitdiffstats
path: root/src/ng/directive/ngSwitch.js
diff options
context:
space:
mode:
authorLucas Galfasó2013-02-06 10:08:40 -0300
committerIgor Minar2013-02-14 19:55:05 -0800
commit0af172040e03811c59d01682968241e3df226774 (patch)
treec1779a7708686c472f598e034a8cec791296782f /src/ng/directive/ngSwitch.js
parente19b04c9ec985821edf1269c628cfa261f81d631 (diff)
downloadangular.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.js43
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);
};
}
});