Как установить стартовую страницу в ионном проекте

Извините, если это глупый вопрос, я до сих пор довольно новичок в этом. У меня есть общее представление о том, как работает навигация с angular js, но я не могу понять, как установить стартовую страницу. Я хочу, чтобы моя страница входа в качестве начальной страницы показывала, что страница входа открыта ( "http://localhost:8100/#/template/login" ), но она отображает только пустой заголовок, который я подозреваемый - из моего индекса (ion-nav-bar).

спасибо.

index.html

<body ng-app="starter">
    <!--
      The nav bar that will be updated as we navigate between views.
    -->
    <ion-nav-bar class="bar-stable">
      <ion-nav-back-button>
      </ion-nav-back-button>
    </ion-nav-bar>
    <!--
      The views will be rendered in the <ion-nav-view> directive below
      Templates are in the /templates folder (but you could also
      have templates inline in this html file if you'd like).
    -->
    <ion-nav-view class="slide-left-right"></ion-nav-view>
  </body>
</html>

login.html

<ion-view view-title="Login" name="login-view">
  <ion-content class="padding">
  <h1>lalalalala</h1>
     <div class="list">
         <label class="item item-input">
              <span class="input-label">Username</span>
              <input type="text">
         </label>
         <label class="item item-input">
              <span class="input-label">Password</span>
              <input type="password">
         </label>
      </div>
      <button class="button button-block button-calm" ng-click="login()">Login</button>
  </ion-content>
</ion-view>

app.js

angular.module('starter', ['ionic', 'starter.controllers', '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 && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
    }
    if (window.StatusBar) {
      // org.apache.cordova.statusbar required
      StatusBar.styleLightContent();
    }
  });
})

.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 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.login', {
    url: '/login',
    views: {
      'login': {
        templateUrl: 'templates/login.html',
        controller: 'loginCtrl'
      }
    }
  })

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

  .state('tab.projects', {
      url: '/projects',
      views: {
        'tab-projects': {
          templateUrl: 'templates/tab-projects.html',
          controller: 'projectsCtrl'
        }
      }
    })
    .state('tab.projects-detail', {
      url: '/projects/:projectsId',
      views: {
        'tab-projects': {
          templateUrl: 'templates/projects-detail.html',
          controller: 'projectsDetailCtrl'
        }
      }
    })

  .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('login');

});

controllers.js

angular.module('starter.controllers', [])

.controller('loginCtrl', function($scope) {})

.controller('DashCtrl', function($scope) {})

.controller('projectsCtrl', function($scope, Chats) {
  $scope.chats = Chats.all();
  $scope.remove = function(chat) {
    Chats.remove(chat);
  }
})

.controller('ChatDetailCtrl', function($scope, $stateParams, Chats) {
  $scope.chat = Chats.get($stateParams.chatId);
})

.controller('AccountCtrl', function($scope) {
  $scope.settings = {
    enableFriends: true
  };
});

Ответы

Ответ 1

Я думаю, что проблемы есть в вашем маршруте по умолчанию:

$urlRouterProvider.otherwise('/tab/login');

Вы определили его в зависимости от abastract вкладки:

$stateProvider

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

и это ваш логин:

.state('tab.login', {
    url: '/login',
    views: {
      'login': {
        templateUrl: 'templates/login.html',
        controller: 'loginCtrl'
      }
    }
  })

имя состояния tab.login, что означает, что оно наследуется от вкладки.

поэтому ваш корень /tab/login.

это должен быть ваш tabs.html:

<ion-tabs class="tabs-icon-top tabs-color-active-positive">

  <ion-tab title="Login" icon-off="ion-ios-pulse" icon-on="ion-ios-pulse-strong" href="#/tab/login">
    <ion-nav-view name="login"></ion-nav-view>
  </ion-tab>

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

</ion-tabs>

так как вы можете увидеть свое имя на основе иона:

<ion-nav-view name="login"></ion-nav-view>

должен соответствовать указанному в вашем состоянии:

.state('tab.login', {
        url: '/login',
        views: {
          'login': {
            templateUrl: 'login.html',
            controller: 'loginCtrl'
          }
        }
      })

Вам не нужно указывать здесь имя вида (login.html):

<ion-view view-title="Login" name="login-view">

Еще одна вещь, которую я заметил, вы используете одно и то же имя для двух разных видов: tab-projects:

.state('tab.projects', {
      url: '/projects',
      views: {
        'tab-projects': {
          templateUrl: 'templates/tab-projects.html',
          controller: 'projectsCtrl'
        }
      }
    })
.state('tab.projects-detail', {
      url: '/projects/:projectsId',
      views: {
        'tab-projects': {
          templateUrl: 'templates/projects-detail.html',
          controller: 'projectsDetailCtrl'
        }
      }
    })

другая вещь имеет больше общего с конвенциями. Если вы используете имена ваших имен, начиная с вкладки -, возможно, вы должны сделать то же самое для login.

Вот plunker с некоторым кодом.

Ответ 2

Измените приложение app.js на

.state('login', {
   url: '/login',
   controller: 'LoginCtrl',
   templateUrl: 'templates/login.html'
})

и $urlRouterProvider.otherwise('/login');

Если вы поместите свой login.html в правильную папку, тогда проблем не будет.

Ответ 3

Я размещал комментарии относительно вашего кода, поэтому позвольте мне сформулировать ответ с некоторыми шагами, которые вы хотели бы выполнить

1

У вас есть беспорядок, как только вы объявляете свои контроллеры, попробуйте следовать руководству, например this, по крайней мере, объявите свои контроллеры/службы/директивы и таким же образом, LoginCtrl, а не LoginCtrl, а другой материал без капитала как первая буква. Это всего лишь совет моего друга.

2:

.state('tab.login', {
    url: '/login',
    views: {
      'login': {
        templateUrl: 'templates/login.html',
        controller: 'loginCtrl'
      }
    }
  })

здесь что-то нужно проверить, имя вашего представления, у вас есть login, но

<ion-view view-title="Login" name="login-view">
  ...
</ion-view>

измените его только на login. И сделайте то же самое в своем маршруте abstract.

как это

<ion-view view-title="Login" name="login">

И это так важно

$urlRouterProvider.otherwise('/login');

который идет в конце $stateProvider. Метод otherwise всегда будет перенаправляться на /login в случае, если любой другой маршрут был сопоставлен

Ответ 4

Вы должны указать имя <ion-nav-view> в своем шаблоне index.html.

например. <ion-nav-view name="viewContent"></ion-nav-view>

Затем на ваших маршрутах вы указываете, в какую часть вашего приложения вы хотите, чтобы ваш шаблон был визуализирован, например:

.state('login', {
    url: '/login',
    views: {
      'viewContent': {
        templateUrl: 'templates/login.html',
        controller: 'loginCtrl'
      }
    }
  })

это отобразит templates/login.html в область viewContent. Именно поэтому UI-маршрутизатор настолько гибкий, что вы можете точно сказать, какие части должны быть заменены при маршрутизации.

Если вам не нужна эта гибкость, просто напишите свои маршруты без части views и добавьте controller и templateUrl прямо в каждое состояние.

также ваш резерв должен быть $urlRouterProvider.otherwise('/login');

Ответ 5

Если вы хотите оценить успех при входе в систему, чтобы показать, что определенные представления не должны находиться в одном состоянии.

Это должно быть правдой:

.state('login',{
  url: "/login",
  views : {
    'menuContent' : {
      templateUrl : "login.html",
      controller : "LoginCtrl"
    }
  }
})

$urlRouterProvider.otherwise("/login");

Следуйте указаниям в качестве совета или руководства по написанию их app.js

<script id="login.html" type="text/ng-template">
  <ion-view view-title="Login" name="login-view">
  <ion-content class="padding">
  <h1>lalalalala</h1>
  <div class="list">
     <label class="item item-input">
          <span class="input-label">Username</span>
          <input type="text">
     </label>
     <label class="item item-input">
          <span class="input-label">Password</span>
          <input type="password">
     </label>
  </div>
  <button class="button button-block button-calm" ng-click="login()">Login</button>
  </ion-content>
</ion-view>
</script>

Ответ 6

У меня была аналогичная проблема... просто откройте файл app.js..так, внизу внизу вы найдете $urlRouterProvider.otherwise('/app/tabs');, так, например, если загружаемая на данный момент страница является "вкладками", просто измените вкладки значений на предпочтительное имя страницы, чтобы эта страница загружалась в качестве первой страницы по умолчанию.

Ответ 7

Имеется файл config.xml. Откройте его, и вы увидите опцию "Стартовая страница". Затем введите любую страницу, которую вы хотите запустить.