aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Minar2012-08-10 15:38:05 -0700
committerIgor Minar2012-08-10 16:14:30 -0700
commit9767f7bdd3e1ce6f65bdea992d67369ead13d813 (patch)
treee3984ea5bcc7d41fb293c89eaaa55cbeeebbc4a8
parent167aa0c29c998be33c49d33302e099b36d1ce0be (diff)
downloadangular.js-9767f7bdd3e1ce6f65bdea992d67369ead13d813.tar.bz2
fix(option): support option elements in datalist
previously we expected to find option elements only within select element and if that was not the case we throw an error. This made it impossible to include datalist element with nested option elements in the template. Closes #1165
-rw-r--r--src/ng/directive/select.js10
-rw-r--r--test/ng/directive/selectSpec.js15
2 files changed, 21 insertions, 4 deletions
diff --git a/src/ng/directive/select.js b/src/ng/directive/select.js
index 27a92c48..77b2f46d 100644
--- a/src/ng/directive/select.js
+++ b/src/ng/directive/select.js
@@ -521,7 +521,6 @@ var optionDirective = ['$interpolate', function($interpolate) {
return {
restrict: 'E',
priority: 100,
- require: '^select',
compile: function(element, attr) {
if (isUndefined(attr.value)) {
var interpolateFn = $interpolate(element.text(), true);
@@ -530,8 +529,13 @@ var optionDirective = ['$interpolate', function($interpolate) {
}
}
- return function (scope, element, attr, selectCtrl) {
- if (selectCtrl.databound) {
+ return function (scope, element, attr) {
+ var selectCtrlName = '$selectController',
+ parent = element.parent(),
+ selectCtrl = parent.data(selectCtrlName) ||
+ parent.parent().data(selectCtrlName); // in case we are in optgroup
+
+ if (selectCtrl && selectCtrl.databound) {
// For some reason Opera defaults to true and if not overridden this messes up the repeater.
// We don't want the view to drive the initialization of the model anyway.
element.prop('selected', false);
diff --git a/test/ng/directive/selectSpec.js b/test/ng/directive/selectSpec.js
index 321990e8..c63d17bf 100644
--- a/test/ng/directive/selectSpec.js
+++ b/test/ng/directive/selectSpec.js
@@ -1108,7 +1108,7 @@ describe('select', function() {
});
- describe('OPTION value', function() {
+ describe('option', function() {
it('should populate value attribute on OPTION', function() {
compile('<select ng-model="x"><option selected>abc</option></select>');
@@ -1125,5 +1125,18 @@ describe('select', function() {
compile('<select ng-model="x"><option>hello</select>');
expect(element).toEqualSelect(['hello']);
});
+
+ it('should not blow up when option directive is found inside of a datalist',
+ inject(function($compile, $rootScope) {
+ var element = $compile('<div>' +
+ '<datalist><option>some val</option></datalist>' +
+ '<span>{{foo}}</span>' +
+ '</div>')($rootScope);
+
+ $rootScope.foo = 'success';
+ $rootScope.$digest();
+ expect(element.find('span').text()).toBe('success');
+ dealoc(element);
+ }));
});
});