AngularJS OnsenUI 在子页面的 nav.popPage() 上重新加载父页面
AngularJS OnsenUI reload parent page on nav.popPage() in child page
我在 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);
可以使用new pageReplace()
that comes with the 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
希望对您有所帮助!
虽然 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();
我正在考虑将其作为一个选项(即 option.reloadPage
)修补到 popPage()
中并提交拉取请求。
丹贾维斯,
谢谢你的想法!我一直在为来自 Ionic 的温泉而苦苦挣扎,所以你的例子真的很有帮助。我稍微修改了一下,如果有人感兴趣,这里有一个替代方案。它并没有破坏我的页面,我需要它来处理一些奇怪的重复指令问题。另外,有时我不得不返回不止一页。
//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++;
};
我在 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);
可以使用new pageReplace()
that comes with the 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
希望对您有所帮助!
虽然 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();
我正在考虑将其作为一个选项(即 option.reloadPage
)修补到 popPage()
中并提交拉取请求。
丹贾维斯,
谢谢你的想法!我一直在为来自 Ionic 的温泉而苦苦挣扎,所以你的例子真的很有帮助。我稍微修改了一下,如果有人感兴趣,这里有一个替代方案。它并没有破坏我的页面,我需要它来处理一些奇怪的重复指令问题。另外,有时我不得不返回不止一页。
//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++;
};