1
votes

I have started an Ionic Tabs project. Now I have a button "initiateProcess" that I call with ng-click and within the controller it performs some operations and then finishes it with going to a certain state (tab.target) with state.go or state.transitionTo.

However, when I don't include that state in my tabs.html, the state will not be loaded. When I do include it, then state.go works fine. This state is independent (can be seen as a child state but not per se) and I don't want it to show in my tabs.

What is going on?

tabs.html (without the tab.target)

<!--
Create tabs with an icon and label, using the tabs-positive style.
Each tab's child <ion-nav-view> directive will have its own
navigation history that also transitions its views in and out.
-->
<ion-tabs class="tabs-icon-top tabs-color-active-positive">


  <!-- Dashboard Tab -->
  <ion-tab title="Status" icon-off="ion-ios7-pulse" icon-on="ion-ios7-pulse-strong" href="#/tab/dash">
    <ion-nav-view name="tab-dash"></ion-nav-view>
  </ion-tab>

  // when I include here Target Tab with <ion-nav-view name = "tab.target" ... then it works


  <!-- Account Tab -->
  <ion-tab title="Account" icon-off="ion-ios7-gear-outline" icon-on="ion-ios7-gear" href="#/tab/account">
    <ion-nav-view name="tab-account"></ion-nav-view>
  </ion-tab>


</ion-tabs>

app.js

// Ionic Starter App

// angular.module is a global place for creating, registering and retrieving Angular modules
// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html)
// the 2nd parameter is an array of 'requires'
// 'starter.services' is found in services.js
// 'starter.controllers' is found in controllers.js
angular.module('starter', ['ionic', 'ngCordova', 'ionic.utils', 'starter.controllers', 'starter.controllers-cloaking', 'starter.services'])

.run(function($ionicPlatform) {
  $ionicPlatform.ready(function() {
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
    // for form inputs)
    if (window.cordova && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
    }
    if (window.StatusBar) {
      // org.apache.cordova.statusbar required
      StatusBar.styleDefault();
    }
  });
})

.config(function($stateProvider, $urlRouterProvider) {

  // Ionic uses AngularUI Router which uses the concept of states
  // Learn more here: https://github.com/angular-ui/ui-router
  // Set up the various states which the app can be in.
  // Each state's controller can be found in controllers.js
  $stateProvider

  // setup an abstract state for the tabs directive
    .state('tab', {
    url: "/tab",
    abstract: true,
    templateUrl: "templates/tabs.html"
  })

  // Each tab has its own nav history stack:
  .state('tab.dash', {
    url: '/dash',
    views: {
      'tab-dash': {
        templateUrl: 'templates/tab-dash.html',
        controller: 'DashCtrl'
      }
    }
  })

  .state('tab.target', {
    url: '/target',
    views: {
      'tab-target': {
        templateUrl: 'templates/tab-target.html',
        controller: 'TargetCtrl'
      }
    }
  })

  .state('tab.account', {
    url: '/account',
    views: {
      'tab-account': {
        templateUrl: 'templates/tab-account.html',
        controller: 'AccountCtrl'
      }
    }
  });

  // if none of the above states are matched, use this as the fallback
  $urlRouterProvider.otherwise('/tab/dash');

});

function in DashController ($state has been injected)

 $scope.initiateProcess = function() {

        // some stuff

        $state.go('tab.target')

    }

button in tab-dash.html

<button class="button button-balanced" ng-click="initiateProcess()">
     Go to Target
    </button>
2
Can you check your console to see if it throws any errors or warnings?Arsalan Ahmad
No errors or warnings....AMG
check your errors. Usually there is one list that list your filename, and its error. You can ignore the default ionic errors like this :(localhost:8100/lib/ionic/js/ionic.bundle.js:7888:12).vdj4y
I don't see any errors. The thing is that it works as long as I include in my tabs.html the ion-nav-view name="tab.target"AMG
well, tabs in ionic needs name. it matches the name of views in your app.js... .let me put in proper formatvdj4y

2 Answers

1
votes

check if your router really work by disabling the $urlRouterProvider.otherwise() . Because it will automatically route you back to tab.dash, which seems like the router is error.

if your url does change to tabs/target/, which mean your router indeed work correctly. try this.

   <ion-tab title="Status" icon-off="ion-ios7-pulse" icon-on="ion-ios7-pulse-strong" href="#/tab/target">
        <ion-nav-view name="tab-target"></ion-nav-view>
      </ion-tab>

.state('tab.target', {
    url: '/target',
   'tab-target': {
      templateUrl: 'templates/tab-target.html',
      controller: 'TargetCtrl'
    }
  })

ion-nav-view is like UIViewController in ios. it is container for your view. If you decide to name it, then you must match the name of views in $stateProvider. Basically ionic is confused where do you want to show tabs.target, because there is no matching container

0
votes

I experienced a similar problem, I was trying to go to a view which didn't have a tab, just like you.

The solution is easy:

When you define your target state, the one that does not have a tab:

.state('tab.target', {
    url: '/target',
    views: {
       'tab-target': {
        templateUrl: 'templates/tab-target.html',
        controller: 'TargetCtrl'
        }
    }
})

Simply set the value of "views" like another state that have a tab, such as:

.state('tab.target', {
    url: '/target',
    views: {
       'tab-dash': {
        templateUrl: 'templates/tab-target.html',
        controller: 'TargetCtrl'
        }
    }
})

Then, when the user browes to the target tab, in the tab bar the "dash" tab will be the one displayed as actual tab.