UNPKG

ionic-angular

Version:

[![Circle CI](https://circleci.com/gh/driftyco/ionic.svg?style=svg)](https://circleci.com/gh/driftyco/ionic)

135 lines (122 loc) 4.26 kB
/** * @ngdoc directive * @name ionNavBackButton * @module ionic * @restrict E * @parent ionNavBar * @description * Creates a back button inside an {@link ionic.directive:ionNavBar}. * * The back button will appear when the user is able to go back in the current navigation stack. By * default, the markup of the back button is automatically built using platform-appropriate defaults * (iOS back button icon on iOS and Android icon on Android). * * Additionally, the button is automatically set to `$ionicGoBack()` on click/tap. By default, the * app will navigate back one view when the back button is clicked. More advanced behavior is also * possible, as outlined below. * * @usage * * Recommended markup for default settings: * * ```html * <ion-nav-bar> * <ion-nav-back-button> * </ion-nav-back-button> * </ion-nav-bar> * ``` * * With custom inner markup, and automatically adds a default click action: * * ```html * <ion-nav-bar> * <ion-nav-back-button class="button-clear"> * <i class="ion-arrow-left-c"></i> Back * </ion-nav-back-button> * </ion-nav-bar> * ``` * * With custom inner markup and custom click action, using {@link ionic.service:$ionicHistory}: * * ```html * <ion-nav-bar ng-controller="MyCtrl"> * <ion-nav-back-button class="button-clear" * ng-click="myGoBack()"> * <i class="ion-arrow-left-c"></i> Back * </ion-nav-back-button> * </ion-nav-bar> * ``` * ```js * function MyCtrl($scope, $ionicHistory) { * $scope.myGoBack = function() { * $ionicHistory.goBack(); * }; * } * ``` */ IonicModule .directive('ionNavBackButton', ['$ionicConfig', '$document', function($ionicConfig, $document) { return { restrict: 'E', require: '^ionNavBar', compile: function(tElement, tAttrs) { // clone the back button, but as a <div> var buttonEle = $document[0].createElement('button'); for (var n in tAttrs.$attr) { buttonEle.setAttribute(tAttrs.$attr[n], tAttrs[n]); } if (!tAttrs.ngClick) { buttonEle.setAttribute('ng-click', '$ionicGoBack()'); } buttonEle.className = 'button back-button hide buttons ' + (tElement.attr('class') || ''); buttonEle.innerHTML = tElement.html() || ''; var childNode; var hasIcon = hasIconClass(tElement[0]); var hasInnerText; var hasButtonText; var hasPreviousTitle; for (var x = 0; x < tElement[0].childNodes.length; x++) { childNode = tElement[0].childNodes[x]; if (childNode.nodeType === 1) { if (hasIconClass(childNode)) { hasIcon = true; } else if (childNode.classList.contains('default-title')) { hasButtonText = true; } else if (childNode.classList.contains('previous-title')) { hasPreviousTitle = true; } } else if (!hasInnerText && childNode.nodeType === 3) { hasInnerText = !!childNode.nodeValue.trim(); } } function hasIconClass(ele) { return /ion-|icon/.test(ele.className); } var defaultIcon = $ionicConfig.backButton.icon(); if (!hasIcon && defaultIcon && defaultIcon !== 'none') { buttonEle.innerHTML = '<i class="icon ' + defaultIcon + '"></i> ' + buttonEle.innerHTML; buttonEle.className += ' button-clear'; } if (!hasInnerText) { var buttonTextEle = $document[0].createElement('span'); buttonTextEle.className = 'back-text'; if (!hasButtonText && $ionicConfig.backButton.text()) { buttonTextEle.innerHTML += '<span class="default-title">' + $ionicConfig.backButton.text() + '</span>'; } if (!hasPreviousTitle && $ionicConfig.backButton.previousTitleText()) { buttonTextEle.innerHTML += '<span class="previous-title"></span>'; } buttonEle.appendChild(buttonTextEle); } tElement.attr('class', 'hide'); tElement.empty(); return { pre: function($scope, $element, $attr, navBarCtrl) { // only register the plain HTML, the navBarCtrl takes care of scope/compile/link navBarCtrl.navElement('backButton', buttonEle.outerHTML); buttonEle = null; } }; } }; }]);