离子/ AngularJs控制器初始化ng-init不起作用

时间:2015-06-22 12:30:37

标签: javascript angularjs ionic

一旦记录我的控制器初始化脚本没有调用:

转到https://billiving-qa.azurewebsites.net/accountant 电子邮件:qa@billiving.com 传球:111111

当要管理帐户时,下拉列表为空。如果刷新(按f5),则会填充列表。然后,如果您进入隐身或删除缓存并重新加载页面,则列表再次为空。

似乎初始化是在我的单页面应用程序的生命周期的后期调用的。

这是我的代码:

<ion-view hide-back-button="true" ng-controller="DashboardCtrl" ng-init="Initialize()">


  <ion-nav-title align-title="center">



  <select ng-options="account.Key as account.Name for account in accounts" ng-change="LoadAccount(account)" 
  ng-model="account.Key">
<option value='' disabled selected>Select Account..</option>
</select>

<a style="cursor: pointer" ng-click="Initialize()">Refresh</a>


  </ion-nav-title>

  <ion-nav-buttons side="right">

  </ion-nav-buttons>

  <ion-nav-buttons side="left">
    <button class="button button-icon button-clear ion-navicon" menu-toggle="left"></button>
  </ion-nav-buttons>
  <ion-content class="page page-dashboard is-pad" style="height:100%">


<iframe frameborder="5" class="frm" ng-src="{{trustSrc(url)}}" scrolling="yes"></iframe>


  </ion-content>
</ion-view>

这里是angularjs代码:

angular.module('myApp.controllers')

    .controller('DashboardCtrl', function ($scope, $http, AppConfig, Utils, AuthService, $state, $sce) {
          Utils.hideIndicator();
          if (!AuthService.isLoggedIn()) {
            $state.go('app.login');
            return;
    }

    $scope.accounts = {};
    $scope.account ={};
    $scope.url = 'about:blank';

    if (localStorage.SelectedKey!=null){
      $scope.account.Key = localStorage.SelectedKey;
      SetAccount($scope.account);
    }


    $scope.Initialize = function(){



      Utils.showIndicator();
      $http.get(AppConfig.endpoint + 'accountants/accounts')
                        .then(function (response) {
                          $scope.accounts = response.data;

                          if ($scope.accounts.length==0)
                            $state.go('app.register');

                          Utils.hideIndicator();
                        });
    };


    $scope.LoadAccount = function(account){
          SetAccount(account);
    };

    function SetAccount(account) {
          $scope.url = AppConfig.BaseAccount + "/Users/Index.aspx?userkey=" + account.Key;
          localStorage.SelectedKey = account.Key;
    }

    $scope.trustSrc = function(src) {
        return $sce.trustAsResourceUrl(src);
    }



});

3 个答案:

答案 0 :(得分:2)

使用Ionic时我遇到了同样的问题,即第二次使用后ng-init无法正常工作。这是因为框架内的缓存机制。它在某种程度上也很有用。但在某些情况下,我们可能不需要此功能。当我们重新加载整个html页面以使ng-init工作时,我们应该在离子视图中使用cache-view="false"来禁用该单页的缓存。

参考:https://forum.ionicframework.com/t/ionic-beta14-how-to-clean-the-cache-for-a-specific-view/14277

答案 1 :(得分:0)

我发现了2个问题:

  1. 您定义DashboardCtrl两次!一旦进入路径配置,一次进入dashboard.html模板。
  2. 为什么使用ng-init?只需在控制器初始化时加载帐户。删除ng-init并直接调用Initialize。
  3. 编辑:

    DashboardCtrl在启动时初始化,因为它是默认页面。您重定向到登录页面,但DashboardCtrl及其页面将由离子框架缓存。登录后,DashboardCtrl不会再次初始化。

    也许你可以重新加载

    $state.go('app.dashboard', {}, {reload: true});
    

    希望这有帮助

答案 2 :(得分:0)

虽然这不适合SPA,但我最终还是使用了这个:

$state.go('app.dashboard');
$window.location.reload(true);