MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Liaison de la réponse dynamique du serveur (json imbriqué)

En fin de compte, la seule chose qui change est la manière dont vous souhaitez que les instructions soient utilisées et étendues. Celles-ci sont un peu différentes des précédentes mais une chose importante est que le appendChild ne doit pas être à l'intérieur la boucle des attributs d'instructions pour le nœud mais juste après en dehors de celui-ci ; une certaine attention doit également être accordée à certains attributs spéciaux, peut-être class n'est pas le seul, qui sait :) ...essayez de remplacer complètement le for block intérieur avec ce qui suit :

var tag = null, a;
if ('tag' in _instr) {
    tag = document.createElement(_instr.tag);

    if ('attributes' in _instr)
        for(a in _instr.attributes) {
            a.match(/^class$/) && (a = 'className');
            tag.setAttribute(a,_instr.attributes[a]);
        }

    if ('events' in _instr)
        for(a in _instr.events)
            tag.addEventListener(a,_instr.events[a], false);

    //
    // if ('content' in _instr && _instr.content!==null)
    //  tag.innerHTML = _instr.content;
    //
    // but take care ... what if is a input[text] 

    tag[_instr.tag=='input' ? 'value' : 'innerHTML'] = ('content' in _instr && _instr.content !== null) ? _instr.content : o[k];

    if ('children' in _instr)
        for(a in _instr.children)
            _(_instr.children[a], a, tag);

    !!_n && !!tag && _n.appendChild(tag);
}

===================

MISE À JOUR

Maintenant, la sortie est maintenant exactement celle attendue. J'ai même corrigé un bug stupide gérant la class attribut. Essayez-le, peut-être même sur d'autres entrées, j'ai essayé de mettre du texte au lieu de null sur certaines données et ça a l'air bien. À bientôt !

function assemble (data, instr) {
    var n = document.createDocumentFragment(), i;
    function create(d) {
        return (function _(_instr, _d, _key, _n) {
            var tag = null, i;
            if ('tag' in _instr) {
                tag = document.createElement(_instr.tag);

                tag.innerHTML = 'content' in _instr && !!_instr.content ? _instr.content : typeof _d == 'string' ? _d : '';

                if ('attributes' in _instr) 
                    for (i in _instr.attributes)
                        tag.setAttribute(i, _instr.attributes[i]);

                if ('events' in _instr)
                    for(i in _instr.events)
                        tag.addEventListener(i,_instr.events[i], false);

                //recur finally
                if ('children' in _instr) {
                    for (i in _instr.children){
                        _(_instr.children[i], _d[i], i, tag);
                    }
                }
                !!_n && _n.appendChild(tag);
            }
            return tag;
        })(instr, d, null);

    }
    return (function (){
        for (i in data) {
            n.appendChild(create(data[i]));
        }
        return n;
    })();
}