KO Components

by John Farrar

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<shop:cart mode="'detailed-list'" items="items"></shop:cart>

<script type="text/html" id="shop_cart_tmpl">
<div data-bind="text: mode"></div><ul data-bind="foreach: items"><li><a data-bind="text: name,attr: {href: 'data/item/'+id}"></a></li></ul>
</script>

JavaScript

xshop_cart_tmpl = "<div data-bind=\"text: mode\"></div><ul data-bind=\"foreach: items\"><li><a data-bind=\"text: name,attr: \{href: 'data/item/'+id\}\"></a></li></ul>";

ko.components.register("shop:cart", {
    viewModel: function (data) {
        this.mode = data.mode;
        this.items = data.items;
    },
    template: shop_cart_tmpl
});

ko.bindingProvider.instance.preprocessNode = function (node) {
    if (ko.components.getComponentNameForNode(node)) {
        var valuesToJoin = [];
        for (var i = 0, atts = node.attributes, n = atts.length, arr = []; i < n; i++) {
            valuesToJoin.push(atts[i].nodeName + ':' + atts[i].value);
        }

        node.setAttribute('params', valuesToJoin.join(','));
    }
}

var vm = {
    items: [{
        id: 1,
        name: 'Test'
    },{
        id: 2,
        name: 'Another'
    },{
        id: 3,
        name: 'Item'
    }]
};

ko.applyBindings(vm);