diff options
| author | Misko Hevery | 2012-03-15 13:40:00 -0700 |
|---|---|---|
| committer | Misko Hevery | 2012-03-19 11:35:09 -0700 |
| commit | 6c5a05ad49a1e083570c3dfe331403398f899dbe (patch) | |
| tree | 2eff786177ee4c76c02c86f0136ae6ae29001ad3 | |
| parent | 192ff61f5d61899e667c6dbce4d3e6e399429d8b (diff) | |
| download | angular.js-6c5a05ad49a1e083570c3dfe331403398f899dbe.tar.bz2 | |
feat(jqLite): add .controller() method
extend JQuery with .controller() method which retrieves the closest controller for a given element
| -rw-r--r-- | src/Angular.js | 1 | ||||
| -rw-r--r-- | src/jqLite.js | 38 | ||||
| -rw-r--r-- | test/jqLiteSpec.js | 25 |
3 files changed, 49 insertions, 15 deletions
diff --git a/src/Angular.js b/src/Angular.js index 282dad5f..0e9a98ef 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -928,6 +928,7 @@ function bindJQuery() { jqLite = jQuery; extend(jQuery.fn, { scope: JQLitePrototype.scope, + controller: JQLitePrototype.controller, injector: JQLitePrototype.injector, inheritedData: JQLitePrototype.inheritedData }); diff --git a/src/jqLite.js b/src/jqLite.js index 96dda112..2dd1aeb7 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -60,9 +60,13 @@ * * ## In addtion to the above, Angular privides an additional method to both jQuery and jQuery lite: * - * - `scope()` - retrieves the current Angular scope of the element. - * - `injector()` - retrieves the Angular injector associated with application that the element is - * part of. + * - `controller(name)` - retrieves the controller of the current element or its parent. By default + * retrieves controller associated with the `ng-controller` directive. If `name` is provided as + * camelCase directive name, then the controller for this directive will be retrieved (e.g. + * `'ngModel'`). + * - `injector()` - retrieves the injector of the current element or its parent. + * - `scope()` - retrieves the {@link api/angular.module.ng.$rootScope.Scope scope} of the current + * element or its parent. * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top * parent element is reached. * @@ -268,6 +272,18 @@ function JQLiteAddNodes(root, elements) { } } +function JQLiteController(element, name) { + return JQLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller'); +} + +function JQLiteInheritedData(element, name, value) { + element = jqLite(element); + while (element.length) { + if (value = element.data(name)) return value; + element = element.parent(); + } +} + ////////////////////////////////////////// // Functions which are declared directly. ////////////////////////////////////////// @@ -321,20 +337,16 @@ function isBooleanAttr(element, name) { forEach({ data: JQLiteData, - inheritedData: function(element, name, value) { - element = jqLite(element); - while (element.length) { - if (value = element.data(name)) return value; - element = element.parent(); - } - }, + inheritedData: JQLiteInheritedData, scope: function(element) { - return jqLite(element).inheritedData('$scope'); + return JQLiteInheritedData(element, '$scope'); }, + controller: JQLiteController , + injector: function(element) { - return jqLite(element).inheritedData('$injector'); + return JQLiteInheritedData(element, '$injector'); }, removeAttr: function(element,name) { @@ -449,7 +461,7 @@ forEach({ // JQLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it // in a way that survives minification. - if (((fn.length == 2 && fn !== JQLiteHasClass) ? arg1 : arg2) === undefined) { + if (((fn.length == 2 && (fn !== JQLiteHasClass && fn !== JQLiteController)) ? arg1 : arg2) === undefined) { if (isObject(arg1)) { // we are a write, but the object properties are the key/values for(i=0; i < this.length; i++) { diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 5b2e35b0..5cad8c24 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -140,8 +140,8 @@ describe('jqLite', function() { describe('injector', function() { it('should retrieve injector attached to the current element or its parent', function() { var template = jqLite('<div><span></span></div>'), - span = template.children().eq(0), - injector = angular.bootstrap(template); + span = template.children().eq(0), + injector = angular.bootstrap(template); expect(span.injector()).toBe(injector); @@ -150,6 +150,27 @@ describe('jqLite', function() { }); + describe('controller', function() { + it('should retrieve controller attached to the current element or its parent', function() { + var div = jqLite('<div><span></span></div>'), + span = div.find('span'); + + div.data('$ngControllerController', 'ngController'); + span.data('$otherController', 'other'); + + expect(span.controller()).toBe('ngController'); + expect(span.controller('ngController')).toBe('ngController'); + expect(span.controller('other')).toBe('other'); + + expect(div.controller()).toBe('ngController'); + expect(div.controller('ngController')).toBe('ngController'); + expect(div.controller('other')).toBe(undefined); + + dealoc(div); + }); + }); + + describe('data', function() { it('should set and get and remove data', function() { var selected = jqLite([a, b, c]); |
