【问题标题】:how to set a starting page in a ionic project如何在离子项目中设置起始页
【发布时间】:2015-07-31 08:33:59
【问题描述】:

对不起,如果这是一个愚蠢的问题,我对此还是很陌生。我对导航如何与 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>

登录.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'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.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
  };
});

【问题讨论】:

  • 你想在标签内显示登录页面吗?可以在控制台发布您遇到的错误。
  • 不,我想在启动时显示登录,登录成功后需要显示标签@Codelord
  • 放置abstract 视图。
  • 另一件重要的事情,一旦你声明了你的控制器,你就会陷入混乱,尝试遵循this 之类的指南,至少以同样的方式声明你的控制器/服务/指令等等,@ 987654328@ 而不是loginCtrl 和其他首字母没有大写的东西。这只是我朋友的建议。

标签: angularjs cordova angular-ui-router ionic-framework


【解决方案1】:

我猜问题出在你的默认路由上:

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

您已根据抽象标签定义了它:

$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

所以你的根目录是 /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 名称:

<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">

我注意到的另一件事是,您对两个不同的视图使用相同的 nametab-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'
        }
      }
    })

另一件事与约定有关。如果您使用以 tab- 开头的视图名称,您可能应该对 login 执行相同操作。

这是一个plunker,其中包含您的一些代码。

【讨论】:

  • 您的答案有效!我的问题在于继承“tab.login”和 tabs.html 中的引用,谢谢您的清晰说明。
  • 没问题。很高兴我能帮上忙。
【解决方案2】:

我一直在为您的代码添加 cmets,所以让我通过您希望遵循的一些步骤来制定答案

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,以防匹配到任何其他路由

【讨论】:

  • 感谢您的建议,我将按照您的说法更改我的声明。 @NietzcheProgrammer
【解决方案3】:

将您的 app.js 更改为

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

$urlRouterProvider.otherwise('/login');

如果您将login.html 放在正确的文件夹中,则不会有任何问题。

【讨论】:

  • @RenaldoGeldenhuis 查看答案。
  • 我喜欢这个,otherwise 方法将始终重定向到/login,以防匹配到任何其他路由。 @Codelord
【解决方案4】:

您应该在index.html 模板中为您的&lt;ion-nav-view&gt; 命名。

例如&lt;ion-nav-view name="viewContent"&gt;&lt;/ion-nav-view&gt;

然后,在您的路线中,您指定要将模板呈现到应用程序的哪个部分,例如:

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

这会将templates/login.html 渲染到viewContent 区域。 这就是 UI-router 如此灵活的原因,因为您可以准确地告诉它在路由时应该替换哪些部分。

如果您不需要这种灵活性,只需编写不带views 部分的路线,然后将controllertemplateUrl 直接添加到每个状态。

你的后备可能应该是$urlRouterProvider.otherwise('/login');

【讨论】:

  • 感谢您的解释,它解决了我遇到的一些问题,但它仍然只显示标题而不显示登录内容。我不知道我是否遗漏了什么? @tmaximini
  • 首先,奇怪的是你的网址是“localhost:8100/#/template/login”——它应该是“localhost:8100/#/login”。你的后备可能应该是 $urlRouterProvider.otherwise('/login'); chrome 开发工具有报错信息吗?
  • 这也可能与您使用标签启动器有关:stackoverflow.com/q/22514999/532102
  • 别忘了给你的 ion-content 添加 has-header,有时候你的 header 会隐藏你的内容: //你的登录内容离子含量>
  • 我根本没有收到任何错误,我按照你说的做了回退,但它仍然显示“localhost:8100/#/template/login”,它在显示模板目录时也有影响吗?对我来说这很有意义,因为登录位于模板文件夹中。使用离子框架在浏览器中进行测试时是否还有任何已知的错误? @tmaximini
【解决方案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>

【讨论】:

  • 我一直在使用这种编码,但我的主要问题仍然存在,我的登录页面的内容没有显示。 @sioesi
【解决方案6】:

我遇到了类似的问题..只需打开您的 app.js 文件..然后在底部您会找到 $urlRouterProvider.otherwise('/app/tabs'); 例如,如果当前加载的页面是“选项卡” 只需将值选项卡更改为您喜欢的页面名称,即可将该页面作为第一个默认页面加载。

【讨论】:

    【解决方案7】:

    有 config.xml 文件。打开它,您将看到“起始页”选项。然后输入您要开始的任何页面。

    【讨论】:

    • 一行代码将是这个答案的完美补充
    猜你喜欢
    • 2016-04-30
    • 2019-10-15
    • 1970-01-01
    • 2019-10-04
    • 2013-02-26
    • 1970-01-01
    • 2011-10-22
    • 2020-03-28
    • 2017-03-31
    相关资源
    最近更新 更多