打印窗口- Angular 1.3 ng-click不能做窗口.在Safari中打开


Print Window - Angular 1.3 ng-click not able to do window.open in Safari

我正在开发一个Angular应用程序,它需要能够以一种漂亮的格式打印表格。这个表对行进行延迟渲染(也就是ng-repeat中的limitTo过滤器),以防止Angular在页面加载时双向绑定所有数据(最多1000项)。

应用中有一个带ng-click的按钮,它调用了一个Angular函数。该函数首先使用$_POST变量进行Ajax调用,从PHP文件中获取HTML,然后使用服务在新窗中打开页面。

PHP文件使用$_POST变量创建包含所有数据(行、排序列、表名等)的HTML页面。这是必需的,因为原始页面没有呈现前面提到的所有行(limitTo过滤器)。

这是调用函数的按钮:

<button class="new-button" ng-click="printTable()">
    Print
</button>

下面是打印服务。注意:printwinwindow的html参数是控制器printTable()中AJAX调用返回的html:

angular.module('appServices', [])
.factory('PrintService', 
["$window",
 function($window){
    return {
        printWindow: function(html){
            var newWin= $window.open("", "_blank");
            newWin.document.write(html);
            newWin.document.close();
            newWin.focus();
        }
    }
} ])...

该代码在Firefox, Chrome和Opera上运行良好。

然而,我有一个问题得到窗口。打开(或$window.open)在Safari网络浏览器上工作。浏览器返回:错误:undefined不是一个对象(求值'newWin.document')

我做了一些搜索通过论坛和阅读Safari实现窗口。开放的不同。有些人建议使用目标为"_blank"的链接标签,或者使用window.open. onclick。

不幸的是,这两种解决方案都不适合我,因为我需要将$_POST参数传递给我的PHP页面。其次,printTable()函数驻留在$作用域中以访问Ajax调用函数。最后,ng-click也有可能在Safari中被阻止创建窗口。

提前感谢您提供的有用的建议。

我通过返回JQUERY的$解决了这个问题。在自定义服务(而不是Angular的$http)中使用{async: false}属性。这使得ajax调用阻塞,但是Safari现在允许打开窗口。

因为我使用JQUERY 2.0,控制台给出以下警告:主线程上的同步XMLHttpRequest是不赞成的,因为它对最终用户的体验有不利影响。获取更多帮助http://xhr.spec.whatwg.org/