Подтвердить что ты не робот

Как скрыть вкладки в Ionic Framework

Я выбрал представление с ионной вкладкой, поэтому я могу использовать систему шаблонов, но я не могу удалить вкладки. Мне нужно подобное представление, и мне удалось удалить панель заголовка, но я не могу удалить панель вкладок

enter image description here

Это то, что я получил до сих пор:

enter image description here

Если я скрою панель вкладок (ion-tabs{display:none}), она также удалит содержимое, чего я не хочу.

4b9b3361

Ответ 1

Посмотрите документацию по вкладкам Ionic:

Чтобы скрыть вкладку, но все же показать содержимое, добавьте класс "tabs-item-hide".

Итак, вы изменили бы это:

<div class="tabs">
  <a class="tab-item" href="#">
    Home
  </a>
  ...
</div>

:

<div class="tabs tabs-item-hide">
  <a class="tab-item" href="#">
    Home
  </a>
  ...
</div>

Ответ 2

Я знаю, что на это уже дан ответ, но есть более "angular способ" сделать это, что может быть полезно. Это делается с помощью настраиваемой директивы, которую вы можете применить к представлениям, которые вы не хотите показывать нижней панель вкладок.

Мое решение для этого в моем приложении было:

1 - Используйте ng-hide, привязанный к переменной rootScope на панели вкладок, поэтому я могу скрыть/показать ее в любом контроллере/представлении моего приложения:

<ion-tabs ng-hide="$root.hideTabs" class="tabs-icon-only">
    <!-- tabs -->
</ion-tabs>

2 - Создайте настраиваемую директиву, которая, если присутствует, скроет панель вкладок (и снова отобразит панель вкладок, когда представление будет уничтожено/отклонено:

var module = angular.module('app.directives', []);
module.directive('hideTabs', function($rootScope) {
    return {
        restrict: 'A',
        link: function($scope, $el) {
            $rootScope.hideTabs = true;
            $scope.$on('$destroy', function() {
                $rootScope.hideTabs = false;
            });
        }
    };
});

3 - примените его к определенным представлениям, которые не нуждаются в видимости панели вкладок:

<ion-view title="New Entry Form" hide-tabs>
    <!-- view content -->
</ion-view>

ps. Я думаю, что это можно улучшить, даже избегая необходимости ng-hide в объявлении <ion-tabs>, позволяя директиве выполнять всю "грязную работу".

Ответ 3

Ответ Дэниела был очень близок (спасибо!), но в моем случае не работал:

  • ng-hide скрывает вкладку содержимое, а также вкладки (для меня, во всяком случае)
  • Я хочу условно скрыть вкладки, передав выражение директиве.

Итак, здесь мой измененный шаблон:

<ion-tabs ng-class="{'tabs-item-hide': $root.hideTabs}" class="tabs-icon-only">
    <!-- tabs -->
</ion-tabs>

Директива (снова основанная на Данииле):

var module = angular.module('app.directives', []);
module.directive('hideTabs', function($rootScope) {
    return {
        restrict: 'A',
        link: function(scope, element, attributes) {
            scope.$watch(attributes.hideTabs, function(value){
                $rootScope.hideTabs = value;
            });

            scope.$on('$destroy', function() {
                $rootScope.hideTabs = false;
            });
        }
    };
});

Использование:

<ion-view title="New Entry Form" hide-tabs='some-bool-expression'>
    <!-- view content -->
</ion-view>

Ответ 4

Я использовал dotfrank ответ, и он работал как шарм, за исключением тех случаев, когда я шел несколько слоев в определенном окне вкладки, а затем использовал кнопку "Назад". Возвращаясь к представлению, которое имеет директиву "hideTabs = 'true", на самом деле будет установлено значение "false", если вы не обернете $watch на hideTabs в событии $ionicView.beforeEnter.

.directive('hideTabs', function($rootScope) {
    return {
        restrict: 'A',
        link: function(scope, element, attributes) {

            scope.$on('$ionicView.beforeEnter', function() {
                scope.$watch(attributes.hideTabs, function(value){
                    $rootScope.hideTabs = value;
                });
            });

            scope.$on('$ionicView.beforeLeave', function() {
                $rootScope.hideTabs = false;
            });
        }
    };
});

Надеюсь, это поможет! (также, это мой первый ответ... так что, если я полностью что-то пропущу, тогда прощай свою пустоту).

Ответ 5

Ответ Dunc очень хороший, но не работает лучше всего, когда дело доходит до кеширования Ionic.

Используется событие $destroy, которое устанавливает переменную $rootScope, когда родительский вид срывается.

Однако, как прокомментировали другие, это событие $destroy происходит слишком поздно, возвращаясь к странице, на которой нужны вкладки. Это приводит к задержке перехода на переходы страниц. Кроме того, класс содержания ионов .has-tabs не добавляется до тех пор, пока не будет получена задержка, поэтому любой контент также будет закрыт вкладками.

Вместо этого мы должны reset в ионическом событии beforeLeave, чтобы гарантировать, что цикл дайджеста перехода получает изменение переменной во времени.

Тот же шаблон:

<ion-tabs ng-class="{'tabs-item-hide': $root.hideTabs}" class="tabs-icon-only">
    <!-- tabs --> 
</ion-tabs>

Директива (снова основанная на Dunc's):

.directive('hideTabs', function($rootScope) {
  return {
      restrict: 'A',
      link: function(scope, element, attributes) {
          scope.$watch(attributes.hideTabs, function(value){
              $rootScope.hideTabs = value;
          });

          scope.$on('$ionicView.beforeLeave', function() {
              $rootScope.hideTabs = false;
          });
      }
  };
});

Использование одинаковое -

<ion-view title="New Entry Form" hide-tabs='some-bool-expression'>
    <!-- view content -->
</ion-view>

Для бонуса, если вы используете SASS, вы можете получить хороший всплывающий переход для панели вкладок, если вы добавите это в ваш .scss файл:

.tabs {
  -webkit-transition: all linear 0.2s;
  transition: all linear 0.2s;
}

.tabs-item-hide > .tabs{
  -webkit-transition: all linear 0.2s;
  transition: all linear 0.2s;
  bottom: -$tabs-height;
  display: flex;
}

Если вы используете ванильный CSS, замените $tabs-height высотой вашего бара.

Ответ 6

Ng-if была единственной директивой, которая сработала для меня.

ng-if="$root.showList"

Надеюсь, что это поможет.

Ответ 7

К сожалению, текущие ответы имеют задержку, прежде чем снова показывать вкладки. Кажется, что $scope получает $destroy немного позже, и когда вы переходите на страницу, которая должна иметь вкладки, есть отставание, прежде чем они будут пересмотрены. Тем не менее, связь paul привела меня к лучшему решению, у которого нет отставания:

app.controller('applicationController', function ($state, $rootScope) {  

    var hideTabsStates = ['tab.inbox-convo']; 

    $rootScope.$on('$ionicView.beforeEnter', function () {
        $rootScope.hideTabs = ~hideTabsStates.indexOf($state.current.name)
    });
});

<ion-tabs ng-class="{ 'tabs-item-hide': $root.hideTabs }">

Ответ 8

Простое переопределение CSS работало для меня пример в кодефее, мое требование заключалось в том, чтобы скрыть основные вкладки для дочерних/внутренних представлений, например всплывающие представления + this не влияет на вторичные вкладки:

<style>
    /* hide the main tabs */
    .tab-nav{
        display: none;
    }
    /* this takes care of the access margins bottom or top tabs */
    .has-tabs, .has-tabs-top, .has-tabs-bottom {
        bottom: 0px !important;
        top: 0px !important;
    }   
</style>

ИЛИ в примере директивы:

angular.element(".tab-nav").css("display":"none");

Не забывайте:

<ion-view hide-nav-bar="true"></ion-view>
<ion-content has-footer="false" has-header="false></ion-content>

Ответ 9

https://github.com/driftyco/ionic/issues/395 Похоже, что вкладки являются довольно сложными в Ionic. Проверьте ссылку, она отлично поработала для меня.