AngularJS OnsenUI在子页面中的nav.popPage()上重新加载父页面

时间:2015-04-06 11:16:35

标签: javascript html angularjs onsen-ui

我在ng-init上调用了一个函数,在那个页面中,我按一下按钮就将新页面推送到了导航器的pageStack。在子页面中,我弹出当前页面。现在,我想在从页面堆栈中删除子页面时重新加载父页面。

以下是代码:

HTML

<ons-navigator var="nav" page="page1.html">

</ons-navigator>

<ons-template id="page1.html">
    <ons-page ng-controller="pageOneController" ng-init="reload()">
        <ons-toolbar>
            <div class="center">Page 1</div>
        </ons-toolbar>
        <ons-button ng-click="nav.pushPage('page2.html')">Push Page</ons-button>
    </ons-page>
</ons-template>

<ons-template id="page2.html">
    <ons-page>
        <ons-toolbar>
            <div class="center">Page 2</div>
        </ons-toolbar>
        <ons-button ng-click="nav.popPage();">Pop Page</ons-button>
    </ons-page>
</ons-template>

AngularJS

module.controller('pageOneController', function(){
    $scope.reload = function(){
        console.log('Page one controller reloaded');
    }
});

更新

一种解决方案是使用

重新加载应用
window.location.reload(true);

3 个答案:

答案 0 :(得分:4)

虽然Fran的答案很有效,但当页面被替换时,UI中会出现一个小的闪烁/打嗝。我使用insertPage()并更改操作顺序采用了略微不同的方法。最终结果是UI流程更流畅:

$scope.replacePreviousPage = function(url) {
      var pages = $scope.nav.getPages(),
          index = pages.length - 2;

      if (index < 0)
          return;

      $scope.nav.insertPage(index, url);
      pages.splice(index, 1);
};

您可以创建另一个函数来封装替换和弹出,或者只调用它们:

$scope.replacePreviousPage('views/page1.html');
$scope.nav.popPage();

我正在考虑将此修补为popPage()作为选项(即option.reloadPage)并提交拉取请求。

答案 1 :(得分:2)

您可以使用new pageReplace()附带的new Onsen UI 1.3.0。您可以将其传递给popPage()的回调,如下所示:

$scope.popAndReplace = function() {
  $scope.nav.popPage({onTransitionEnd : function() {
     $scope.nav.replacePage('page1.html', { animation : 'none' } );
  }})
};

在此工作:http://codepen.io/frankdiox/pen/gbJGZw

希望它有所帮助!

答案 2 :(得分:1)

danjarvis,

谢谢你的想法!我正在与来自Ionic的温泉挣扎,所以你的榜样真的很有帮助。我稍微修改了它,如果有人感兴趣,这里是另一种选择。它并没有为我破坏ons-pages,我需要它来处理一些奇怪的重复指令问题。另外,有时候我不得不回到一页以上。

//function to go back and reload controller
$rootScope.index = 0;
$rootScope.replacePreviousPage = function (url) {
    var c = 0;
    angular.forEach(nav.getPages(), function (v, i) {
        if (i >= $rootScope.index) {
            nav.getPages()[i].destroy();
            c++;
        }
    });
    nav.insertPage($rootScope.index, url);
    nav.popPage();
};

//back
$rootScope.back = function (page) {
    if (page === "index") {
        location.reload();
    } else {
        if (page === "version") {
            $rootScope.index = $rootScope.index - 2;
        } else {
            $rootScope.index--;
        }
        $rootScope.replacePreviousPage('templates/' + page + '.html');
    }
};

//forward
$rootScope.forward = function (page) {
    nav.pushPage('templates/' + page + '.html');
    $rootScope.index++;
};