Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit fbf17db

Browse files
fix(sidenav): add support for legacy API
1 parent 246ae54 commit fbf17db

File tree

3 files changed

+100
-65
lines changed

3 files changed

+100
-65
lines changed

src/components/sidenav/demoBasicUsage/script.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ angular
44
$scope.toggleLeft = buildDelayedToggler('left');
55
$scope.toggleRight = buildToggler('right');
66
$scope.isOpenRight = function(){
7-
var right = $mdSidenav('right');
8-
return right && right.isOpen();
7+
return $mdSidenav('right').isOpen();
98
};
109

1110
/**

src/components/sidenav/sidenav.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ function SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {
6767
/**
6868
* Service API that supports three (3) usages:
6969
* $mdSidenav().find("left") // sync (must already exist) or returns undefined
70-
* $mdSidenav("left").toggle(); // sync (must already exist) or returns undefined; deprecated
70+
* $mdSidenav("left").toggle(); // sync (must already exist) or returns reject promise;
7171
* $mdSidenav("left",true).then( function(left){ // async returns instance when available
7272
* left.toggle();
7373
* });
@@ -76,9 +76,32 @@ function SidenavService($mdComponentRegistry, $mdUtil, $q, $log) {
7676
if ( angular.isUndefined(handle) ) return service;
7777

7878
var instance = service.find(handle);
79-
return !instance && (enableWait === true) ? service.waitFor(handle) : instance;
79+
return !instance && (enableWait === true) ? service.waitFor(handle) :
80+
!instance && angular.isUndefined(enableWait) ? addLegacyAPI(service, handle) : instance;
8081
};
8182

83+
/**
84+
* For failed instance/handle lookups, older-clients expect an response object with noops
85+
* that include `rejected promise APIs`
86+
*/
87+
function addLegacyAPI(service, handle) {
88+
var falseFn = function() { return false; };
89+
var rejectFn = function() {
90+
return $q.when($mdUtil.supplant(errorMsg, [handle || ""]));
91+
};
92+
93+
return angular.extend({
94+
isLockedOpen : falseFn,
95+
isOpen : falseFn,
96+
toggle : rejectFn,
97+
open : rejectFn,
98+
close : rejectFn,
99+
then : function(callback) {
100+
return waitForInstance(handle)
101+
.then(callback || angular.noop);
102+
}
103+
}, service);
104+
}
82105
/**
83106
* Synchronously lookup the controller instance for the specified sidNav instance which has been
84107
* registered with the markup `md-component-id`

src/components/sidenav/sidenav.spec.js

Lines changed: 74 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ describe('mdSidenav', function() {
200200
});
201201

202202
describe("controller Promise API", function() {
203-
var $material, $rootScope;
203+
var $material, $rootScope, $timeout;
204204

205205
function flush() {
206206
$material.flushInterimElement();
@@ -350,83 +350,96 @@ describe('mdSidenav', function() {
350350

351351
});
352352

353-
it('should find an instantiation using `$mdSidenav(id)`', inject(function($mdSidenav) {
354-
var el = setup('md-component-id="left"');
355-
$timeout.flush();
353+
describe('$mdSidenav lookups', function() {
354+
var $rootScope, $timeout;
356355

357-
// Lookup instance still available in the component registry
358-
var instance = $mdSidenav('left');
359-
expect(instance).toBeTruthy();
360-
}));
356+
beforeEach(inject(function(_$rootScope_, _$timeout_) {
357+
$rootScope = _$rootScope_;
358+
$timeout = _$timeout_;
359+
}));
361360

362-
it('should find a deferred instantiation using `$mdSidenav(id, true)`', inject(function($mdSidenav) {
363-
var instance;
361+
it('should find an instantiation using `$mdSidenav(id)`', inject(function($mdSidenav) {
362+
var el = setup('md-component-id="left"');
363+
$timeout.flush();
364364

365-
// Lookup deferred (not existing) instance
366-
$mdSidenav('left', true).then(function(inst) {
367-
instance = inst;
368-
});
369-
expect(instance).toBeUndefined();
365+
// Lookup instance still available in the component registry
366+
var instance = $mdSidenav('left');
367+
expect(instance).toBeTruthy();
368+
}));
370369

371-
// Instantiate `left` sidenav component
372-
var el = setup('md-component-id="left"');
373-
$timeout.flush();
370+
it('should find a deferred instantiation using `$mdSidenav(id, true)`', inject(function($mdSidenav) {
371+
var instance;
374372

375-
expect(instance).toBeDefined();
376-
expect(instance.isOpen()).toBeFalsy();
373+
// Lookup deferred (not existing) instance
374+
$mdSidenav('left', true).then(function(inst) {
375+
instance = inst;
376+
});
377+
expect(instance).toBeUndefined();
377378

378-
// Lookup instance still available in the component registry
379-
instance = $mdSidenav('left', true);
380-
expect(instance).toBeTruthy();
381-
}));
379+
// Instantiate `left` sidenav component
380+
var el = setup('md-component-id="left"');
381+
$timeout.flush();
382382

383-
it('should find a deferred instantiation using `$mdSidenav().waitFor(id)` ', inject(function($mdSidenav) {
384-
var instance;
383+
expect(instance).toBeDefined();
384+
expect(instance.isOpen()).toBeFalsy();
385385

386-
// Lookup deferred (not existing) instance
387-
$mdSidenav().waitFor('left').then(function(inst) {
388-
instance = inst;
389-
});
390-
expect(instance).toBeUndefined();
386+
// Lookup instance still available in the component registry
387+
instance = $mdSidenav('left', true);
388+
expect(instance).toBeTruthy();
389+
}));
391390

392-
// Instantiate `left` sidenav component
393-
var el = setup('md-component-id="left"');
394-
$timeout.flush();
391+
it('should find a deferred instantiation using `$mdSidenav().waitFor(id)` ', inject(function($mdSidenav) {
392+
var instance;
395393

396-
expect(instance).toBeDefined();
397-
expect(instance.isOpen()).toBeFalsy();
394+
// Lookup deferred (not existing) instance
395+
$mdSidenav().waitFor('left').then(function(inst) {
396+
instance = inst;
397+
});
398+
expect(instance).toBeUndefined();
398399

399-
// Lookup instance still available in the component registry
400-
instance = undefined;
401-
instance = $mdSidenav('left');
400+
// Instantiate `left` sidenav component
401+
var el = setup('md-component-id="left"');
402+
$timeout.flush();
402403

403-
expect(instance).toBeTruthy();
404-
}));
404+
expect(instance).toBeDefined();
405+
expect(instance.isOpen()).toBeFalsy();
405406

406-
it('should not find a lazy instantiation without waiting `$mdSidenav(id)`', inject(function($mdSidenav) {
407-
var instance = $mdSidenav('left');
408-
expect(instance).toBeUndefined();
407+
// Lookup instance still available in the component registry
408+
instance = undefined;
409+
instance = $mdSidenav('left');
409410

410-
// Instantiate `left` sidenav component
411-
var el = setup('md-component-id="left"');
412-
$timeout.flush();
411+
expect(instance).toBeTruthy();
412+
}));
413413

414-
instance = $mdSidenav('left');
415-
expect(instance).toBeDefined();
416-
expect(instance.isOpen()).toBeFalsy();
417-
}));
414+
it('should not find a lazy instantiation without waiting `$mdSidenav(id)`', inject(function($mdSidenav) {
415+
var instance = $mdSidenav('left');
416+
expect(instance.isOpen).toBeDefined(); // returns legacy API with noops
417+
418+
instance = $mdSidenav('left', false); // since enableWait == false, return false
419+
expect(instance).toBeFalsy();
418420

419-
it('should not find a lazy instantiation without waiting `$mdSidenav().find(id)`', inject(function($mdSidenav) {
420-
var instance = $mdSidenav().find('left');
421-
expect(instance).toBeUndefined();
421+
// Instantiate `left` sidenav component
422+
var el = setup('md-component-id="left"');
423+
$timeout.flush();
422424

423-
// Instantiate `left` sidenav component
424-
var el = setup('md-component-id="left"');
425-
$timeout.flush();
425+
instance = $mdSidenav('left'); // returns instance
426+
expect(instance).toBeDefined();
427+
expect(instance.isOpen()).toBeFalsy();
428+
}));
429+
430+
it('should not find a lazy instantiation without waiting `$mdSidenav().find(id)`', inject(function($mdSidenav) {
431+
var instance = $mdSidenav().find('left');
432+
expect(instance).toBeUndefined();
433+
434+
// Instantiate `left` sidenav component
435+
var el = setup('md-component-id="left"');
436+
$timeout.flush();
437+
438+
instance = $mdSidenav().find('left');
439+
expect(instance).toBeDefined();
440+
expect(instance.isOpen()).toBeFalsy();
441+
}));
442+
});
426443

427-
instance = $mdSidenav().find('left');
428-
expect(instance).toBeDefined();
429-
expect(instance.isOpen()).toBeFalsy();
430-
}));
431444

432445
});

0 commit comments

Comments
 (0)