Ответ 1
Я создал простую директиву для печати содержимого div с использованием техники iframe. Это немного хакерское, но работает очень хорошо. нет лучшего способа сделать это, на мой взгляд. Директива script:
'use strict';
angular.module('yourAppNameHere').directive('printDiv', function () {
return {
restrict: 'A',
link: function(scope, element, attrs) {
element.bind('click', function(evt){
evt.preventDefault();
PrintElem(attrs.printDiv);
});
function PrintElem(elem)
{
PrintWithIframe($(elem).html());
}
function PrintWithIframe(data)
{
if ($('iframe#printf').size() == 0) {
$('html').append('<iframe id="printf" name="printf"></iframe>'); // an iFrame is added to the html content, then your div contents are added to it and the iFrame content is printed
var mywindow = window.frames["printf"];
mywindow.document.write('<html><head><title></title><style>@page {margin: 25mm 0mm 25mm 5mm}</style>' // Your styles here, I needed the margins set up like this
+ '</head><body><div>'
+ data
+ '</div></body></html>');
$(mywindow.document).ready(function(){
mywindow.print();
setTimeout(function(){
$('iframe#printf').remove();
},
2000); // The iFrame is removed 2 seconds after print() is executed, which is enough for me, but you can play around with the value
});
}
return true;
}
}
};
});
В шаблоне вы помечаете кнопку печати следующим образом:
<a href="#" print-div=".css-selector-of-the-div-you-want-to-print">Print!</a>
И что он, он должен работать. Хакерская часть состоит в том, что iFrame удаляется после некоторого количества секунд, поскольку нет способа перекрестного браузера для обнаружения конца выполнения печати, поэтому вы можете указать, сколько времени потребуется для его запуска.
Возможно, вам придется включить jQuery, чтобы он работал, я не уверен, поскольку я почти никогда не работаю без него. Я добавил некоторые встроенные комментарии, чтобы сделать вещи более ясными. Я использовал код этого ответа, который использует всплывающее окно для печати содержимого div (но вне Angular.js). Возможно, вам понравится этот подход.