zaterdag 21 januari 2017

Wel of geen ORM?

Jaren geleden heb ik zelf een Object Relational Mapper geschreven als reactie op het slechte ORM framework genaamd NHibernate. De ORM heet HierarchyObjects.

Als je een nieuwe applicatie begint, moet je dan een ORM gebruiken of niet?
Ik deel de mening van Norm.

donderdag 19 januari 2017

Javascript: track changes in DOM

Je kunt in javascript erachter komen of een attribuut is veranderd van de DOM. Dit kan bijvoorbeeld komen door een javascript die een class toevoegt bij een selectie van een element.

Zie het javascript MutationObserver object.

maandag 9 januari 2017

Print directly from Chrome

Als je een PDF direct wilt printen vanuit Chrome, dan kun je de PDF laden in een hidden iframe en vervolgens "print()" te roepen tegen het contentWindow van de iframe.

Helaas!

Chrome heeft een bug waardoor de readyState niet veranderd als je een binary laadt in een iframe! Je weet dus niet wanneer de PDF geheel is ingeladen.
Hoe kom je uit deze situatie?
Door de PDF te laden in een Javascript Blob en vervolgens een interne URL te maken naar deze Blob. Via deze route werkt het onload event wel.

Zie hieronder de code:


function print() {
var printData = _base64ToArrayBuffer(base64PdfBytesFromServer);
var printBlob = new Blob([printData], { type: "application/pdf" });
window.printPdfLoaded = function() {
$("#thePDF")[0].contentWindow.print();
URL.revokeObjectURL(internalUrl);
}
var internalUrl = URL.createObjectURL(printBlob);
var ifr=$('<iframe/>', {
id: 'thePDF',
src: internalUrl,
style: 'display:none',
onload: 'window.printPdfLoaded()'
});
$(document.body).append(ifr);
}

function _base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array( len );
for (var i = 0; i < len; i++)        {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}

dinsdag 3 januari 2017

Javascript Lexical scope problems and solution

var i, f = [ ], base = 1;
for (i = 0; i < 10; i++) {
    f.push(function() { return base + i; });
}
alert(f[0]());

Resultaat: -> 11


Nesten van functions maakt niet uit:

var i,
    f = [ ],
    base = 1;
for (i = 0; i < 10; i++) {
    f.push(function() { return function() { return base + i; } });
}
alert(f[0]()());

-> 11

Solution:
De enige oplossing is de volgende:

var i,
    f = [ ],
    base = 1;
for (i = 0; i < 10; i++) {
    f.push((function(base, i) {
       return function() { return base + i; }
    })(base, i));
}
alert(f[0]());

-> 1

a must read on the subject: https://spin.atomicobject.com/2014/10/20/javascript-scope-closures/