We can add a knockout component to add some javascript behaviour in our pages. This is how to do it step by step.
1 . In the existing template, in which you want to include the knockout component, you first need to declare the component using the declarative notation and using the <script type="text/x-magento-init" />
tag.
This allows you to specify the component, basically the js file and the associated template.
<script type="text/x-magento-init"> { "#demo-component-container": { "Magento_Ui/js/core/app": { "components": { "demo-ko-component": { "component" : "MyNamespace_MyModule/js/ko-component", "config" : { "template": "MyNamespace_MyModule/ko-template" } } } } } } </script>
2. In the same template, you then need to declare the container that will receive the component.
<div id="demo-component-container" data-bind="scope: 'demo-ko-component'"> <!-- ko template: getTemplate() --><!-- /ko --> </div>
3. You need to create the js component.
It has to be place in app/code/MyNamespace/MyModule/view/frontend/web/js/ko-component.js.
For the purpose of the example, we are simply setting a property inputValue that we will use in the template.
/** * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @author Didier Berlioz <berliozd@gmail.com> * @copyright Copyright (c) 2016 Addeos (http://www.addeos.com) */ define(['jquery', 'uiComponent', 'ko'], function ($, Component, ko) { 'use strict'; return Component.extend({ initialize: function () { this._super(); this.inputValue = ko.observable('my input value'); } }); } );
4. You need to create the component template.
It will be placed here app/code/Namespace/Module/view/frontend/web/template/ko-template.html .
As said earlier, in the template we will just bind an input tag with the property inputValue set in the js component.
<p>Here is my knockout template.</p> <input type="text" data-bind="value: inputValue">
And that’s all.