FastForEach.prototype.insertAllAfter = function()

in src/bindingHandlers/fastForeach.ts [279:309]


FastForEach.prototype.insertAllAfter = function (nodeOrNodeArrayToInsert, insertAfterNode) {
    let frag, len, i;
    const containerNode = this.element;

    // poor man's node and array check, should be enough for this
    if (nodeOrNodeArrayToInsert.nodeType === undefined && nodeOrNodeArrayToInsert.length === undefined) {
        throw new Error("Expected a single node or a node array");
    }
    if (nodeOrNodeArrayToInsert.nodeType !== undefined) {
        ko.virtualElements.insertAfter(containerNode, nodeOrNodeArrayToInsert, insertAfterNode);
        return [nodeOrNodeArrayToInsert];
    } else if (nodeOrNodeArrayToInsert.length === 1) {
        ko.virtualElements.insertAfter(containerNode, nodeOrNodeArrayToInsert[0], insertAfterNode);
    } else if (supportsDocumentFragment) {
        frag = document.createDocumentFragment();

        for (i = 0, len = nodeOrNodeArrayToInsert.length; i !== len; ++i) {
            frag.appendChild(nodeOrNodeArrayToInsert[i]);
        }
        ko.virtualElements.insertAfter(containerNode, frag, insertAfterNode);
    } else {
        // Nodes are inserted in reverse order - pushed down immediately after
        // the last node for the previous item or as the first node of element.
        for (i = nodeOrNodeArrayToInsert.length - 1; i >= 0; --i) {
            const child = nodeOrNodeArrayToInsert[i];
            if (!child) { break; }
            ko.virtualElements.insertAfter(containerNode, child, insertAfterNode);
        }
    }
    return nodeOrNodeArrayToInsert;
};