MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Bindende dynamische Serverantwort (verschachteltes JSON)

Am Ende ändert sich nur, wie Sie die Anweisungen verwenden und erweitern möchten. Diese unterscheiden sich etwas von den vorherigen, aber eine wichtige Sache ist, dass appendChild sollte nicht drinnen sein die Anweisungsattributschleife für den Knoten, aber direkt danach außerhalb davon; einige spezielle Attribute müssen ebenfalls beachtet werden, vielleicht class ist nicht der einzige, der weiß :) ... versuchen Sie, den inneren for block vollständig zu ersetzen mit folgendem :

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);
}

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

AKTUALISIERT

Jetzt ist die Ausgabe jetzt genau die erwartete. Ich habe sogar einen dummen Fehler im Umgang mit der class behoben Attribut. Probieren Sie es aus, vielleicht sogar bei anderen Eingaben. Ich habe versucht, Text anstelle von Null auf einige Daten zu setzen, und es sieht gut aus. Bis bald!

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;
    })();
}