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

Commit a3cd619

Browse files
crisbetoThomasBurleson
authored andcommitted
fix(tabs): fix object reference-related errors in IE
The tabs component usually only queries the DOM once for all the elements, however when the template gets compiled later on, those references get lost. This fix addresses this by updating the references on the next digest. Also improves some DOM lookups and removes some that weren't being used anymore. Referencing #3953. Fixes #8276. Closes #8354
1 parent afbb7c5 commit a3cd619

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

src/components/tabs/js/tabsController.js

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ function MdTabsController ($scope, $element, $window, $mdConstant, $mdTabInkRipp
7676
bindEvents();
7777
$mdTheming($element);
7878
$mdUtil.nextTick(function () {
79+
// Note that the element references need to be updated, because certain "browsers"
80+
// (IE/Edge) lose them and start throwing "Invalid calling object" errors, when we
81+
// compile the element contents down in `compileElement`.
82+
elements = getElements();
7983
updateHeightFromContent();
8084
adjustOffset();
8185
updateInkBarStyles();
@@ -91,7 +95,8 @@ function MdTabsController ($scope, $element, $window, $mdConstant, $mdTabInkRipp
9195
*/
9296
function compileTemplate () {
9397
var template = $attrs.$mdTabsTemplate,
94-
element = angular.element(elements.data);
98+
element = angular.element($element[0].querySelector('md-tab-data'));
99+
95100
element.html(template);
96101
$compile(element.contents())(ctrl.parent);
97102
delete $attrs.$mdTabsTemplate;
@@ -219,7 +224,7 @@ function MdTabsController ($scope, $element, $window, $mdConstant, $mdTabInkRipp
219224
*/
220225
function handleSelectedIndexChange (newValue, oldValue) {
221226
if (newValue === oldValue) return;
222-
227+
223228
ctrl.selectedIndex = getNearestSafeIndex(newValue);
224229
ctrl.lastSelectedIndex = oldValue;
225230
ctrl.updateInkBarStyles();
@@ -428,19 +433,17 @@ function MdTabsController ($scope, $element, $window, $mdConstant, $mdTabInkRipp
428433
*/
429434
function getElements () {
430435
var elements = {};
436+
var node = $element[0];
431437

432438
// gather tab bar elements
433-
elements.wrapper = $element[ 0 ].getElementsByTagName('md-tabs-wrapper')[ 0 ];
434-
elements.data = $element[ 0 ].getElementsByTagName('md-tab-data')[ 0 ];
435-
elements.canvas = elements.wrapper.getElementsByTagName('md-tabs-canvas')[ 0 ];
436-
elements.paging = elements.canvas.getElementsByTagName('md-pagination-wrapper')[ 0 ];
437-
elements.tabs = elements.paging.getElementsByTagName('md-tab-item');
438-
elements.dummies = elements.canvas.getElementsByTagName('md-dummy-tab');
439-
elements.inkBar = elements.paging.getElementsByTagName('md-ink-bar')[ 0 ];
440-
441-
// gather tab content elements
442-
elements.contentsWrapper = $element[ 0 ].getElementsByTagName('md-tabs-content-wrapper')[ 0 ];
443-
elements.contents = elements.contentsWrapper.getElementsByTagName('md-tab-content');
439+
elements.wrapper = node.querySelector('md-tabs-wrapper');
440+
elements.canvas = elements.wrapper.querySelector('md-tabs-canvas');
441+
elements.paging = elements.canvas.querySelector('md-pagination-wrapper');
442+
elements.inkBar = elements.paging.querySelector('md-ink-bar');
443+
444+
elements.contents = node.querySelectorAll('md-tabs-content-wrapper > md-tab-content');
445+
elements.tabs = elements.paging.querySelectorAll('md-tab-item');
446+
elements.dummies = elements.canvas.querySelectorAll('md-dummy-tab');
444447

445448
return elements;
446449
}
@@ -494,7 +497,7 @@ function MdTabsController ($scope, $element, $window, $mdConstant, $mdTabInkRipp
494497
function shouldPaginate () {
495498
if (ctrl.noPagination || !loaded) return false;
496499
var canvasWidth = $element.prop('clientWidth');
497-
angular.forEach(getElements().dummies, function (tab) { canvasWidth -= tab.offsetWidth; });
500+
angular.forEach(elements.dummies, function (tab) { canvasWidth -= tab.offsetWidth; });
498501
return canvasWidth < 0;
499502
}
500503

@@ -563,7 +566,7 @@ function MdTabsController ($scope, $element, $window, $mdConstant, $mdTabInkRipp
563566
function calcPagingWidth () {
564567
var width = 1;
565568

566-
angular.forEach(getElements().dummies, function (element) {
569+
angular.forEach(elements.dummies, function (element) {
567570
//-- Uses the larger value between `getBoundingClientRect().width` and `offsetWidth`. This
568571
// prevents `offsetWidth` value from being rounded down and causing wrapping issues, but
569572
// also handles scenarios where `getBoundingClientRect()` is inaccurate (ie. tabs inside
@@ -613,7 +616,7 @@ function MdTabsController ($scope, $element, $window, $mdConstant, $mdTabInkRipp
613616
* issues when attempting to focus an item that is out of view.
614617
*/
615618
function redirectFocus () {
616-
getElements().dummies[ ctrl.focusIndex ].focus();
619+
elements.dummies[ ctrl.focusIndex ].focus();
617620
}
618621

619622
/**

0 commit comments

Comments
 (0)