{"id":11421,"date":"2016-04-13T13:43:31","date_gmt":"2016-04-13T18:43:31","guid":{"rendered":"http:\/\/jianmingli.com\/wp\/?p=11421"},"modified":"2016-04-13T16:33:13","modified_gmt":"2016-04-13T21:33:13","slug":"knockout-js-examples","status":"publish","type":"post","link":"https:\/\/jianmingli.com\/wp\/?p=11421","title":{"rendered":"Knockout.js Examples"},"content":{"rendered":"<div class='toc wptoc'>\n<h2>Contents<\/h2>\n<ol class='toc-odd level-1'>\n\t<li>\n\t\t<a href=\"#Create_Sample_Project\">Create Sample Project<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Toggle_Elements\">Toggle Elements<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Bind_Multiple_View_Models_on_a_Single_Page\">Bind Multiple View Models on a Single Page<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Observable_Examples\">Observable Examples<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Template_Binding_Example\">Template Binding Example<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Event_Binding_Example\">Event Binding Example<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Extending_Observables\">Extending Observables<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Add_Custom_Functions_to_Observables\">Add Custom Functions to Observables<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Form_Posting_with_AJAX\">Form Posting with AJAX<\/a>\n\t<\/li>\n\t<li>\n\t\t<a href=\"#Receiving_Data_with_AJAX\">Receiving Data with AJAX<\/a>\n\t<\/li>\n<\/ol>\n<\/ol>\n<\/div>\n<div class='wptoc-end'>&nbsp;<\/div>\n<span id=\"Create_Sample_Project\"><h2>Create Sample Project<\/h2><\/span>\n<p>* From VS2013, create a new <em>ASP.NET Web Application project<\/em> named, e.g. <strong>ko1<\/strong><br \/>\n* Select <em>Empty <\/em>template and add features:<br \/>\n&#8211; MVC<br \/>\n&#8211; Web API<br \/>\n* Also install packages:<br \/>\n&#8211; jQuery<br \/>\n&#8211; Bootstrap<br \/>\n&#8211; Knockout<br \/>\n* See this <a href=\"?p=11266\">post <\/a>for details on how setup a MVC5 and SPA sample project.<\/p>\n<span id=\"Toggle_Elements\"><h2>Toggle Elements<\/h2><\/span>\n<p>* Hide\/Show elements<br \/>\n* Add\/Remove elements<\/p>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n    <title>Test Observables<\/title>\r\n<\/head>\r\n<body>\r\n    <div>\r\n        <span id=\"Hello_\"><h1>Hello <span data-bind=\"text: computedFullName\"><\/span>!<\/h1><\/span>\r\n\r\n        <div data-bind=\"visible: showDescription\">\r\n            <h2 data-bind=\"text: description\"><\/h2>\r\n        <\/div>\r\n        <button type=\"button\" data-bind=\"click: toggleDescription\">Toggel Description<\/button><\/div>\r\n        <!-- ko if: showDescription-->\r\n        <h2 data-bind=\"text: description\"><\/h2>\r\n        <!-- \/ko -->\r\n    <script>\r\n        function Person(firstName, lastName, description) {\r\n            var self = this;\r\n\r\n            self.firstName = firstName;\r\n            self.lastName = lastName;\r\n            self.description = description;\r\n\r\n            self.computedCnt = 0;\r\n            self.showDescription = ko.observable(false);\r\n\r\n            self.computedFullName = ko.computed(function () {\r\n                self.computedCnt++;\r\n                return self.firstName + ' ' + self.lastName;\r\n            });\r\n\r\n            self.toggleDescription = function () {\r\n                self.showDescription(!self.showDescription());\r\n            };\r\n\r\n        };\r\n\r\n        var vm = new Person('John', 'Doe', 'Sample description.');\r\n        ko.applyBindings(vm);\r\n    <\/script>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n<span id=\"Bind_Multiple_View_Models_on_a_Single_Page\"><h2>Bind Multiple View Models on a Single Page<\/h2><\/span>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n    <title><\/title>\r\n<\/head>\r\n<body>\r\n    <div id=\"greeting1\">\r\n        <h1 data-bind=\"text: greetings()\"><\/h1>\r\n    <\/div>\r\n    <div id=\"greeting2\">\r\n        <h1 data-bind=\"text: greetings()\"><\/h1>\r\n    <\/div>\r\n    <script>\r\n        function Greeting(name) {\r\n            var self = this;\r\n\r\n            self.name = name;\r\n            self.greetings = function(){\r\n                return 'Hello ' + self.name + '!';\r\n            };\r\n        };\r\n\r\n        var vm1 = new Greeting('John');\r\n        ko.applyBindings(vm1, document.getElementById('greeting1'));\r\n\r\n        var vm2 = new Greeting('Jane');\r\n        ko.applyBindings(vm2, document.getElementById('greeting2'));\r\n    <\/script>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n<span id=\"Observable_Examples\"><h2>Observable Examples<\/h2><\/span>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n    <title>Test Observables<\/title>\r\n<\/head>\r\n<body>\r\n    <div>\r\n        <span id=\"Hello__1\"><h1>Hello <span data-bind=\"text: computedFullName\"><\/span>!<\/h1><\/span>\r\n\r\n        <div data-bind=\"visible: showDescription\">\r\n            <h2 data-bind=\"text: description\"><\/h2>\r\n        <\/div>\r\n        <button type=\"button\" data-bind=\"click: toggleDescription\">Toggel Description<\/button><\/div>\r\n        <!-- ko if: showDescription-->\r\n        <h2 data-bind=\"text: description\"><\/h2>\r\n        <!-- \/ko -->\r\n    <script>\r\n        function Person(firstName, lastName, description) {\r\n            var self = this;\r\n\r\n            self.firstName = firstName;\r\n            self.lastName = lastName;\r\n            self.description = description;\r\n\r\n            self.computedCnt = 0;\r\n            self.showDescription = ko.observable(false);\r\n\r\n            self.computedFullName = ko.computed(function () {\r\n                self.computedCnt++;\r\n                return self.firstName + ' ' + self.lastName;\r\n            });\r\n\r\n            self.toggleDescription = function () {\r\n                self.showDescription(!self.showDescription());\r\n            };\r\n\r\n        };\r\n\r\n        var vm = new Person('John', 'Doe', 'Sample description.');\r\n        ko.applyBindings(vm);\r\n    <\/script>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n<span id=\"Template_Binding_Example\"><h2>Template Binding Example<\/h2><\/span>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n    <title><\/title>\r\n<\/head>\r\n<body>\r\n    <table>\r\n        <tbody data-bind=\"template: {name: 'greeting-template', foreach: greetings}\">\r\n\r\n        <\/tbody>\r\n    <\/table>\r\n    <br \/>\r\n\r\n    <div data-bind=\"template: {name: 'greeting-template2', foreach: greetings}\">\r\n\r\n    <\/div>\r\n\r\n        <script type=\"text\/html\" id=\"greeting-template\">\r\n            <tr>\r\n                <td data-bind=\"text: greet\"><\/td>\r\n                <td data-bind=\"text: solute\"><\/td>\r\n                <td data-bind=\"text: $parent.name\"><\/td>\r\n            <\/tr>\r\n        <\/script>\r\n        <script type=\"text\/html\" id=\"greeting-template2\">\r\n            <span data-bind=\"text: greet\"><\/span> \r\n            <span data-bind=\"text: solute\"><\/span> \r\n            <span data-bind=\"text: $parent.name\"><\/span><br\/>\r\n        <\/script>\r\n        <script>\r\n            function Greetings(name) {\r\n                var self = this;\r\n                self.name = name;\r\n\r\n                self.greetings = [\r\n                    {\r\n                        greet: 'Hello',\r\n                        solute: 'Mrs.'\r\n                    },\r\n                    {\r\n                        greet: 'Howdy',\r\n                        solute: 'Dr.'\r\n                    },\r\n                    {\r\n                        greet: 'Hey',\r\n                        solute: 'Mr.'\r\n                    }\r\n                ];\r\n            };\r\n\r\n            var vm = new Greetings('John');\r\n            ko.applyBindings(vm);\r\n        <\/script>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n<span id=\"Event_Binding_Example\"><h2>Event Binding Example<\/h2><\/span>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n    <title>Test Form1<\/title>\r\n<\/head>\r\n<body>\r\n    <textarea data-bind=\"value: myText, event: { mouseover: clearText() }\"><\/textarea>\r\n    <br\/>\r\n    Character remaining: <span data-bind=\"text: charRemaining\"><\/span>\r\n    <br \/>\r\n    <span data-bind=\"text: msg\"><\/span>\r\n\r\n    <script>\r\n        function MyText() {\r\n            var self = this;\r\n\r\n            self.myText = ko.observable('Enter text here');\r\n            self.maxCharAllowed = 25;\r\n            self.msg = ko.observable('');\r\n\r\n            self.charRemaining = ko.computed(function () {\r\n                return self.maxCharAllowed - self.myText().length;\r\n            });\r\n\r\n            self.clearText = function () {\r\n                self.myText('');\r\n            };\r\n\r\n            self.myText.subscribe(function () {\r\n                self.msg('myText changed to: ' + self.myText());\r\n            });\r\n        };\r\n\r\n        var vm = new MyText();\r\n        ko.applyBindings(vm);\r\n    <\/script>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n<span id=\"Extending_Observables\"><h2>Extending Observables<\/h2><\/span>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n    <title>Extend Observable 1<\/title>\r\n<\/head>\r\n<body>\r\n    <textarea data-bind=\"value: myText\"><\/textarea><br\/>\r\n    Characters remaining: <span data-bind=\"text: charRemaining\"><\/span>\r\n    <script>\r\n        ko.extenders.maxCharacters = function (target, max) {\r\n            var result = ko.computed({\r\n                read: target,\r\n                write: function (newValue) {\r\n                    alert(newValue);\r\n                    var current = target();\r\n                    if (newValue.length <= max) {\r\n                        target(newValue);\r\n                    } else {\r\n                        target(current);\r\n                        target.notifySubscribers(current);\r\n                    };\r\n                }\r\n            }).extend({ notify: 'always' });\r\n\r\n            return result;\r\n        };\r\n\r\n        function ViewModel() {\r\n            var self = this;\r\n\r\n            self.maxCharacters = 10;\r\n            self.myText = ko.observable('')\r\n            .extend({ maxCharacters: self.maxCharacters });\r\n\r\n            self.charRemaining = ko.computed(function () {\r\n                return self.maxCharacters - self.myText().length;\r\n            });\r\n        };\r\n\r\n        var vm = new ViewModel();\r\n        ko.applyBindings(vm);\r\n    <\/script>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n<span id=\"Add_Custom_Functions_to_Observables\"><h2>Add Custom Functions to Observables<\/h2><\/span>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n    <title>Add Custom Function to Observables<\/title>\r\n<\/head>\r\n<body>\r\n    List of books:\r\n    <ul>\r\n        <!-- ko foreach: books -->\r\n        <li>\r\n            <input type=\"checkbox\" data-bind=\"attr: { id: isbn }, checked: owned \" \/>\r\n            <label data-bind=\"attr: { for: isbn }, text: title\"><\/label>\r\n        <\/li>\r\n        <!-- \/ko -->\r\n    <\/ul>\r\n\r\n    Books you own:\r\n    <ul>\r\n        <!-- ko foreach: booksOwned -->\r\n        <li data-bind=\"text: title\"><\/li>\r\n        <!-- \/ko -->\r\n    <\/ul> \r\n    <script>\r\n        ko.observableArray.fn.booksOwned = function (property, value) {\r\n            return ko.computed(function () {\r\n                var allItems = this();\r\n                var machingItems = [];\r\n\r\n                for (var i = 0; i < allItems.length; i++) {\r\n                    var current = allItems[i];\r\n                    if (ko.unwrap(current[property]) === value) {\r\n                        machingItems.push(current);\r\n                    };\r\n                };\r\n\r\n                return machingItems;\r\n            }, this);\r\n        };\r\n\r\n        \r\n        function ViewModel() { \r\n            var self = this; \r\n\r\n            self.books = ko.observableArray([ \r\n                { \r\n                    title: 'Book1', \r\n                    isbn: '123451', \r\n                    owned: ko.observable(false) \r\n                },\r\n                {\r\n                    title: 'Book2',\r\n                    isbn: '123452', \r\n                    owned: ko.observable(false) \r\n                },\r\n                {\r\n                    title: 'Book3', \r\n                    isbn: '123453', \r\n                    owned: ko.observable(false) \r\n                } \r\n            ]); \r\n\r\n            self.booksOwned = self.books.booksOwned('owned', true); \r\n        }; \r\n\r\n        var viewModel = new ViewModel(); \r\n        ko.applyBindings(viewModel); \r\n    <\/script>\r\n<\/body>\r\n<\/html>\r\n\r\n<\/pre>\n<span id=\"Form_Posting_with_AJAX\"><h2>Form Posting with AJAX<\/h2><\/span>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <title>Test Ajax Post 1<\/title>\r\n    <script src=\"~\/Scripts\/jquery-1.10.2.js\"><\/script>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n<\/head>\r\n<body>\r\n    <form data-bind=\"submit: save2, with: person\">\r\n        <input type=\"text\" data-bind=\"value: firstName\"\r\n               placeholder=\"Enter first name\"  \/>\r\n        <br \/>\r\n        <input type=\"text\" data-bind=\"value: lastName\"\r\n               placeholder=\"Enter last name\"  \/>\r\n        <br \/>\r\n        <input type=\"email\" data-bind=\"value: email\"\r\n               placeholder=\"Enter email\"  \/>\r\n        <br \/>\r\n        <input type=\"submit\" \/>\r\n    <\/form>\r\n\r\n    <script>\r\n        function ViewModel() {\r\n            var self = this;\r\n\r\n            self.person = {\r\n                firstName : ko.observable(),\r\n                lastName: ko.observable(),\r\n                email: ko.observable()\r\n            };\r\n\r\n            self.save = function (form) {\r\n                $.ajax({\r\n                    url: '\/Home\/AjaxPost1',\r\n                    data: ko.toJS(self.person),\r\n                    type: 'POST',\r\n                    contentType: 'application\/x-www-form-urlencoded',\r\n                    error: function (xhr, status, error) {\r\n                        alert(xhr.responseText);\r\n                    },\r\n                    success: function () {\r\n                        alert('Saved!');\r\n                    }\r\n                });\r\n            };\r\n\r\n            self.save2 = function (form) {\r\n                $.ajax({\r\n                    url: '\/Home\/AjaxPost1',\r\n                    data: ko.toJSON(self.person),\r\n                    type: 'POST',\r\n                    contentType: 'application\/json',\r\n                    error: function (xhr, status, error) {\r\n                        alert(xhr.responseText);\r\n                    },\r\n                    success: function () {\r\n                        alert('Saved by json!');\r\n                    }\r\n                });\r\n            };\r\n        };\r\n        var vm = new ViewModel();\r\n        ko.applyBindings(vm);\r\n    <\/script>\r\n<\/body>\r\n<\/html>\r\n<\/pre>\n<span id=\"Receiving_Data_with_AJAX\"><h2>Receiving Data with AJAX<\/h2><\/span>\n<p>* TagController:<\/p>\n<pre lang=\"csharp\">\r\n    public class TagController : ApiController\r\n    {\r\n        public IEnumerable<string> GetAllTags()\r\n        {\r\n            var tags = new List<string>();\r\n            tags.Add(\"Tag1\");\r\n            tags.Add(\"Tag2\");\r\n            tags.Add(\"Tag3\");\r\n            return tags;\r\n        }\r\n    }\r\n<\/pre>\n<p>* Web page:<\/p>\n<pre lang=\"xml\">\r\n@{\r\n    Layout = null;\r\n}\r\n\r\n<!DOCTYPE html>\r\n\r\n<html>\r\n<head>\r\n    <meta name=\"viewport\" content=\"width=device-width\" \/>\r\n    <script src=\"~\/Scripts\/jquery-1.10.2.js\"><\/script>\r\n    <script src=\"~\/Scripts\/knockout-3.0.0.js\"><\/script>\r\n    <title>Test AJAX Receive One<\/title>\r\n<\/head>\r\n<body>\r\n    <label for=\"tags\">Filter a tag:<\/label>\r\n    <input id=\"tags\" data-bind=\"value: tag\" \/><br\/>\r\n\r\n    Tags matching:\r\n    <ul>\r\n        <!-- ko foreach: matchedTags -->\r\n        <li data-bind=\"text: $data\"><\/li>\r\n        <!-- \/ko -->\r\n    <\/ul>\r\n        <script>\r\n        function ViewModel() {\r\n            var self = this;\r\n\r\n            self.availableTags = ko.observableArray([]);\r\n            self.matchedTags = ko.observableArray([]);\r\n            self.tag = ko.observable();\r\n\r\n            self.tag.subscribe(function (value) {\r\n                self.matchedTags.removeAll();\r\n                if (value !== '') {\r\n                    $.ajax({\r\n                        url: '\/api\/tag\/',\r\n                        type: 'GET',\r\n                        contentType: 'application\/json',\r\n                        dataType: 'json',\r\n                        success: function (data) {\r\n                            self.availableTags(data);\r\n                            for (var i = 0; i < self.availableTags().length; i++) {\r\n                                if (self.availableTags()[i].toLowerCase().indexOf(value) >= 0) {\r\n                                    self.matchedTags.push(self.availableTags()[i]);\r\n                                };\r\n                            };\r\n                        },\r\n                        error: function (xhr, status, error) {\r\n                            alert(xhr.responseText);\r\n                        }\r\n                    });\r\n                };\r\n            });\r\n\r\n        };\r\n\r\n        var vm = new ViewModel();\r\n        ko.applyBindings(vm);\r\n\r\n        <\/script>\r\n<\/body>\r\n<\/html>\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Create Sample Project * From VS2013, create a new ASP.NET Web Application project named, e.g. ko1 * Select Empty template and add features: &#8211; MVC &#8211; Web API * Also install packages: &#8211; jQuery &#8211; Bootstrap &#8211; Knockout * See &hellip; <a href=\"https:\/\/jianmingli.com\/wp\/?p=11421\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[18,687],"tags":[226,496,688],"class_list":["post-11421","post","type-post","status-publish","format-standard","hentry","category-javascript","category-knockout","tag-example","tag-javascript-2","tag-knockout"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8cRUO-2Yd","_links":{"self":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/11421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11421"}],"version-history":[{"count":6,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/11421\/revisions"}],"predecessor-version":[{"id":11432,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/11421\/revisions\/11432"}],"wp:attachment":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}