DEV Community

Paboda Hettiarachchi
Paboda Hettiarachchi

Posted on • Edited on

Knockout - Magento 2

I always found it difficult when it comes to a JS implementation in Magento 2. Reasons geing not experienced in Knockout JS scope and had a general fear and confusion in ES6/jQuery/Knockout combined together.

I'm trying to break the barrier here as I needed to be perfectly clear on the concepts.

As inline script is not the proper standards, we normally have a phtml and a js file included. In some cases we need to use html file as well.

exampleone

exampleone.phtml

<div id="one"><?= "TESTING" ?></div>
<script type="text/x-magento-init">
    {
        "#one": {
            "Paboda_LearnKo/js/exampleone":{}
        }
    }
</script>
Enter fullscreen mode Exit fullscreen mode

exampleone.js

define([], function(){
    var mageJsComponent = function()
    {
        console.log('hello...');
    };
    return mageJsComponent;
});
Enter fullscreen mode Exit fullscreen mode

As using script tags in phtml is not considered, data-mage-init should be used in the html instead

<div id="one" data-mage-init='{"Paboda_LearnKo/js/exampleone": {}}'><?= "TESTING" ?></div>
Enter fullscreen mode Exit fullscreen mode

exampletwo - data-bind with scope

exampletwo.phtml

<div data-bind="scope: 'text-binding'">
    <div><?= "Scope Binding" ?></div>
    <div id="main">
        <h1 data-bind="text: sayHello"></h1>
    </div>
</div>

<script type="text/x-magento-init">
        {
            "*": {
                "Magento_Ui/js/core/app": {
                    "components": {
                        "text-binding": {
                            "component": "Paboda_LearnKo/js/exampletwo"
                        }
                    }
                }
            }
        }
</script>

Enter fullscreen mode Exit fullscreen mode

exampletwo.js

define([
    'uiComponent'
], function(Component) {

    return Component.extend({
        initialize: function () {
            this._super();
            this.sayHello = "This is the binding text from KO...";
        },
    });
});
Enter fullscreen mode Exit fullscreen mode

examplethree - data-bind with scope in html template

examplethree.phtml

<div data-bind="scope: 'text-binding'">
    <div><?= "Scope Binding" ?></div>
    <!-- ko template: getTemplate() --><!-- /ko -->
</div>

<script type="text/x-magento-init">
        {
            "*": {
                "Magento_Ui/js/core/app": {
                    "components": {
                        "text-binding": {
                            "component": "Paboda_LearnKo/js/examplethree",
                            "template" : "Paboda_LearnKo/examplethree"
                        }
                    }
                }
            }
        }
</script>

Enter fullscreen mode Exit fullscreen mode

examplethree.js

define([
    'uiComponent'
], function(Component) {

    return Component.extend({
        initialize: function () {
            this._super();
            this.sayHelloFromTemplate = "This is the binding text from KO template...";
        },
    });
});

Enter fullscreen mode Exit fullscreen mode

examplethree.html

<div id="main">
    <h1 data-bind="text: sayHelloFromTemplate"></h1>
</div>

Enter fullscreen mode Exit fullscreen mode

examplefour - show html as in data-bind but with data-mage-config

examplefour.phtml

<div id="countdown" data-mage-init='{"Paboda_LearnKo/js/example4": {}}'></div>

Enter fullscreen mode Exit fullscreen mode

examplefour.js

define([
    'jquery',
    'Magento_Ui/js/lib/core/storage/local'
], function ($, storage) {
    'use strict';
    return function (config, element) {
        let showHtml = function () {
            $(element).html(
                "test"
            );
        }
        showHtml();
    };
});
Enter fullscreen mode Exit fullscreen mode

Top comments (0)