如何使用$ state.go从另一个视图正确地重新启动视图

时间:2019-04-16 17:56:45

标签: angularjs angular-ui-router ionic-v1

我尝试使用这种方法将用户从一个州发送到另一州:

$state.go('splash');

这正常工作,但是,当用户被发送到我的splash视图时,代码不会重新启动。

这是启动状态的html:

<ion-view hide-nav-bar="true">
  <ion-content class="splash-screen" scroll="false">
    <div class="loading">
      <i class="fa fa-circle-o-notch fa-spin fa-5x fa-fw"></i>
    </div>
  </ion-content>
</ion-view>

<script id="login.html" type="text/ng-template">
  <ion-modal-view>
    <ion-header-bar class="bar bar-header bar-stable">
      <h1 class="title">Login</h1>
    </ion-header-bar>
    <ion-content>
      <div class="list padding">
        <div class="error" ng-if="errors">
          <p ng-bind-html="error_message"></p>
        </div>
        <label class="item item-input">
          <input ng-model="data.password" type="password" placeholder="Password">
        </label>
        <button class="button button-full button-positive" ng-click="login(data)">Login</button>
      </div>
    </ion-content>
  </ion-modal-view>
</script>

这是视图的控制器:

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

.controller('SplashCtrl', function($scope, $http, $state, $ionicModal, $ionicLoading, $ionicPlatform, $timeout, $localstorage, appAPI) {

  $scope.data = {};
  $scope.data.password = '';

  $ionicModal.fromTemplateUrl("login.html", {
    scope: $scope,
    animation: 'slide-in-up'
  }).then(function(modal) {
    $scope.modal = modal;
  });

  $scope.openModal = function() {
    $scope.modal.show();
  };

  $scope.login = function(data) {
     alert(data.password);
  };

  $ionicPlatform.ready(function() {

    $scope.openModal();

  });

});

当用户第一次访问splash视图时,模态将按预期的方式加载,但是,当他们从$state.go定向到那里时-模态不会加载。

有人在想如何使它正常工作吗?

3 个答案:

答案 0 :(得分:0)

多次调用$ ionicPlatform.ready()

不幸的是,传递给该函数的其他回调将被静默忽略。 (ARGH!) 1

除了将回调函数作为参数外,它还会返回已准备好平台的承诺。

兑现承诺:

$ionicPlatform.ready().then(function() {

    $scope.openModal();

});

答案 1 :(得分:0)

我希望您希望在用户被路由到“ splash”状态时重新加载“ SplashCtrl”控制器。 如果是这样,请尝试使用此$ state.go('splash',{},{reload:true});

答案 2 :(得分:0)

您尚未共享您的整个项目,所以我不能说真的。看来您的结构有些偏离。您应该只有一个ionicPlatform.ready(),并且应该设置环境。完成后,应将用户转发到您的第一个视图,而无需打开模式。

这就是我在应用程序中进行检查的方式。平台就绪函数具有$ state.go('app.calendar');这是我的第一个视图(假设它们已登录)-如果未登录init函数,则从promise中返回错误,并且statechange错误代码将其转发到登录注册页面。

状态控制器

Items

检查是否已登录。

TreeView

回复到状态错误-应用程序优先是登录或注册页面。

.state('app', {
    url: '/app',
    cache: false,
    abstract: true,
    templateUrl: 'templates/tabs.html',
    controller: 'TabCtrl',
    resolve: {
        user: function (UserService) {
            var value = UserService.init();
            return value;
        }
    }
})
// Calendar
.state('app.calendar', {
    url: "/calendar",
    cache: true,
    views: {
        'calendar-tab': {
            templateUrl: 'templates/calendar.html',
            controller: 'CalendarController'
        }
    }
})