我正在为我的网站创建一个打印页面:http://vivule.ee/0/print
我想在页面加载时启动window.print()
。我尝试了不同的方法,但都没有成功。我知道这是可能的,因为我可以监听已完成的Ajax调用,但是如何在Angular中完成?
我的信息路径:HTML-> angular-> php-> mysql table-> php-> json-> angular-> HTML
答案 0 :(得分:3)
你可以使用$ viewContentLoaded 每次重新加载ngView内容时都会发出。 检查此[link]:https://docs.angularjs.org/api/ngRoute/directive/ngView 如果要加载ngView,可以使用此事件确保视图已完全加载。
$scope.$on('$viewContentLoaded', function(){
$window.print();
});
答案 1 :(得分:2)
好的,通过使用promises,$ watch,$ timeout和setTimeout
来实现这一点关于承诺: http://andyshora.com/promises-angularjs-explained-as-cartoon.html
关于angular $ watch: How do I use $scope.$watch and $scope.$apply in AngularJS?
你可以看到它在这里工作: http://vivule.ee/0/print
这是我最终得到的野兽(检查代码中的评论):
if($routeParams.print){
//Set variable for $watch to listen
$scope.game = null;
//Start script only after angular has changed content in ng-view
$scope.$on('$viewContentLoaded', function(){
//Listen to $scope.game variable change
$scope.$watch('game', function(newVal, oldVal){
//Force angular not to fire script on load
if(newVal != oldVal) {
//Force script to run AFTER ng-repeat has rendered its things to the DOM
$timeout(function(){
//And finally setTimout to wait for browser to render the custom fonts for print preview
setTimeout(function(){
//Print document
window.print();
//window.close();
}, 100);
}, 0);
}
}, true);
});
}
答案 2 :(得分:0)
当promise(Ajax)解决后,你可以设置一个标志
像 getApplication.then(function(response){//做一些事情 $ scope.isApplicaionLoaded = true; });
在UI中您可以使用标志 NG-显示=" isApplicaionLoaded"