From e9555f760658bec03db2f3b5e31b2dc727267490 Mon Sep 17 00:00:00 2001 From: gdi2290 Date: Tue, 29 Jul 2014 16:02:31 -0700 Subject: [PATCH] feat(getControllers): allow objects for require allowing objects, similar to $Q.all, read out more clearly for example current ngModelDirective ```javascript var ngModelDirective = function() { return { restrict: 'A', require: ['ngModel', '^?form', '^?ngModelOptions'], controller: NgModelController, link: { pre: function(scope, element, attr, ctrls) { // Pass the ng-model-options to the ng-model controller if (ctrls[2]) { ctrls[0].$options = ctrls[2].$options; } // notify others, especially parent forms var modelCtrl = ctrls[0], formCtrl = ctrls[1] || nullFormCtrl; formCtrl.$addControl(modelCtrl); scope.$on('$destroy', function() { formCtrl.$removeControl(modelCtrl); }); }, post: function(scope, element, attr, ctrls) { var modelCtrl = ctrls[0]; if (modelCtrl.$options && modelCtrl.$options.updateOn) { element.on(modelCtrl.$options.updateOn, function(ev) { scope.$apply(function() { modelCtrl.$$debounceViewValueCommit(ev && ev.type); }); }); } element.on('blur', function(ev) { scope.$evalAsync(function() { modelCtrl.$setTouched(); }); }); } } }; }; ``` ngModelDirective with a require object ```javascript var ngModelDirective = function() { return { restrict: 'A', require: { ngModel: 'ngModel', form: '^?form', ngModelOptions: '^?ngModelOptions' }, controller: NgModelController, link: { pre: function(scope, element, attr, ctrls) { // Pass the ng-model-options to the ng-model controller if (ctrls.ngModelOptions) { ctrls.ngModel.$options = ctrls.ngModelOptions.$options; } // notify others, especially parent forms var modelCtrl = ctrls.ngModel, formCtrl = ctrls.form || nullFormCtrl; formCtrl.$addControl(modelCtrl); scope.$on('$destroy', function() { formCtrl.$removeControl(modelCtrl); }); }, post: function(scope, element, attr, ctrls) { var modelCtrl = ctrls.ngModel; if (modelCtrl.$options && modelCtrl.$options.updateOn) { element.on(modelCtrl.$options.updateOn, function(ev) { scope.$apply(function() { modelCtrl.$$debounceViewValueCommit(ev && ev.type); }); }); } element.on('blur', function(ev) { scope.$evalAsync(function() { modelCtrl.$setTouched(); }); }); } } }; }; ``` --- src/ng/compile.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index 5a8103d7f024..c8b1293e496b 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -1441,10 +1441,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) { require, directiveName); } return value; - } else if (isArray(require)) { - value = []; - forEach(require, function(require) { - value.push(getControllers(directiveName, require, $element, elementControllers)); + } else if (isArray(require) || isObject(require)) { + value = isArray(require) ? [] : {}; + forEach(require, function(require, key) { + value[key] = getControllers(directiveName, require, $element, elementControllers); }); } return value;