离子 - 单击后退按钮时,重新加载并以ng-repeat显示新数据

时间:2015-03-09 14:51:22

标签: angularjs angularjs-ng-repeat ionic-framework angularjs-routing ionic

背景

我有一个ng-repeat列表转到详细信息页面(有一个后退按钮)。 $scope.items变量是从首次加载页面时使用refreshItems()函数发生的get请求加载的。

问题

单击详细信息页面上的后退按钮后,您将返回到正确的页面,但列表已刷新。我需要刷新此列表,以便加载和显示新项目。

尝试解决方案

我认为我可以简单地将“后退”按钮连接到使用ng-click返回的ionicHistory函数,然后调用我的refreshItems()函数;但是,这不会重新加载第一页上的项目。

以上尝试 返回到最后一页触发refreshItems()功能(并且新数据已加载,我可以看到,感谢console.log()语句,但我猜测需要重建ng-repeat。我在$scope.$apply()以及$route.reload()上找到了一些信息,但当我将它们放在goBack()函数的末尾时,这些信息都没有解决问题。

代码摘录

controller.js

$scope.refreshItems = function() {

    console.log("Refreshing items!");

    $http.get('http://domain/page.aspx').then(function(resp) {
        $scope.items = resp.data; console.log('[Items] Success', resp.data);
    }, function(err) { console.error('ERR', err); });

};


$scope.goBack = function() {
    $ionicHistory.goBack();
    $scope.refreshItems();
};

主页HTML

<div class="list">

    <a ng-repeat="i in items" class="item" href="#/tab/details?ID={{i.Item_ID}}">
        <b>Item {{i.Item_Name}}</b>
    </a>

</div>

详细信息页面上的后退按钮

<ion-nav-bar>
    <ion-nav-back-button class="button-clear" ng-click="goBack();">
        <i class="ion-arrow-left-c"></i> Back
    </ion-nav-back-button>
</ion-nav-bar>

可能的方向?

主页上有refresher,调用refreshItems() - 并正确刷新它们。当我尝试将刷新与$ionicHistory.goBack()$state.go()配对时,问题肯定是肯定的。有没有一种方法可以通过编程方式调用刷新器(加载后/加载),因为直接调用刷新器调用的函数不起作用?

4 个答案:

答案 0 :(得分:29)

ionicConfigProvider中设置缓存标记。在状态提供程序中禁用缓存,如下所示:

$stateProvider.state('mainPage', {
   cache: false,
   url : '/dashboard',
   templateUrl : 'dashboard.html'
})

有关详细信息,请参阅manual

答案 1 :(得分:10)

所有离子观点均为cached;防止缓存如下:

cache-view="false"

例如:

<ion-view view-title="Title" cache-view="false">

答案 2 :(得分:2)

我找到了解决方案!

解决方案是使用$scope.$on('$stateChangeSuccess')功能。使用函数参数检查to / from视图,或使用$location.path()

$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {

    console.log("State changed: ", toState);

    if ($location.path() == "/tab/main") {
        $scope.refreshItems();
    }

}

答案 3 :(得分:1)

您还可以从详细信息页面广播事件,并在列表控制器中侦听此事件。

http://www.dotnet-tricks.com/Tutorial/angularjs/HM0L291214