{"id":1964,"date":"2012-12-13T14:40:00","date_gmt":"2012-12-13T14:40:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/webdev\/2012\/12\/13\/knockout-intellisense-in-asp-net-and-web-tools-2012-2-rc\/"},"modified":"2022-08-10T01:33:59","modified_gmt":"2022-08-10T08:33:59","slug":"knockout-intellisense-in-asp-net-and-web-tools-2012-2-rc","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/knockout-intellisense-in-asp-net-and-web-tools-2012-2-rc\/","title":{"rendered":"Knockout Intellisense in ASP.NET and Web Tools 2012.2 RC"},"content":{"rendered":"<p>WTE (Web Tools Extension)&nbsp;1.2 RC is part of the ASP.NET and Web Tools 2012.2 RC and it&rsquo;s available for download from <a href=\"http:\/\/www.microsoft.com\/download\/details.aspx?id=36053\">http:\/\/www.microsoft.com\/download\/details.aspx?id=36053.<\/a><\/p>\n<p>Knockout Intellisense&nbsp;is an exciting new feature in WTE 1.2 RC.&nbsp; Knockout is a declarative JavaScript MVVM system for client-side data binding.&nbsp; See <a href=\"http:\/\/knockoutjs.com\/\">http:\/\/knockoutjs.com\/<\/a> for complete information and <a href=\"http:\/\/learn.knockoutjs.com\/\">http:\/\/learn.knockoutjs.com\/<\/a> for tutorials.&nbsp;<br \/>Knockout Intellisense allows you to code Knockout quickly and accurately, and custom bindings are fully supported!<\/p>\n<p>With WTE 1.2 RC installed, you can utilize the Knockout Intellisense feature on any web page by:<\/p>\n<ul>\n<li>Loading Knockout-n.n.n.js or Knockout-n.n.n.debug.js<\/li>\n<li>Defining a <em>view model<\/em> in JavaScript as an object or a function<\/li>\n<li>Calling ko.applyBindings(viewModel) after the page is loaded<\/li>\n<\/ul>\n<h2>Loading Knockout<\/h2>\n<p>Add Knockout to an existing project by selecting &ldquo;Manage Nuget Packages&hellip;&rdquo;:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/7510.KO-RC-1.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/7510.KO-RC-1.jpg\" alt=\"\" width=\"344\" height=\"175\" border=\"0\" \/><\/a><\/p>\n<p>Search online for &ldquo;Knockout&rdquo; and select &ldquo;Knockoutjs&rdquo;:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/7183.KO-RC-2.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/7183.KO-RC-2.jpg\" alt=\"\" border=\"0\" \/><\/a><\/p>\n<p>Press &ldquo;Install&rdquo;<\/p>\n<p>Drag the Knockout JavaScript file from Scripts to the head of your web page:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/5280.KO-RC-3.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/5280.KO-RC-3.jpg\" alt=\"\" border=\"0\" \/><\/a><\/p>\n<p>Note: to use Knockout with Bundling and Minification, see the &ldquo;Working with Bundling and Minification&rdquo; topic below.<\/p>\n<p>Knockout does not require jQuery, but the two work great together.<\/p>\n<h2>Defining a View Model<\/h2>\n<p>A view model can be defined in one of two ways; see <a href=\"http:\/\/knockoutjs.com\/\">http:\/\/knockoutjs.com\/<\/a> for complete details.<\/p>\n<p>Declare the data structure you want to use as a JavaScript object:<\/p>\n<p><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;script&gt;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var viewModel = {<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fieldOne: &#8220;string&#8221;,<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fieldTwo: 12345,<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fieldThree: null,<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fieldFour: ko.observable(&#8220;two way data-binding&#8221;),<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fieldFive: ko.observableArray([1,2,3])<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;\/script&gt;<\/span><\/p>\n<p>&nbsp;Or, declare a function with members describing your data:<\/p>\n<p><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;script&gt;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function viewModel() {<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.detailsEnabled = ko.observable(false);<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.enableDetails = function () {<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.detailsEnabled(true);<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.disableDetails = function () {<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.detailsEnabled(false);<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;\/script&gt;<\/span><\/p>\n<h2>Applying Bindings<\/h2>\n<p>If you&rsquo;ve described your view model as an object, bind itusing the syntax:<\/p>\n<p><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; ko.applyBindings(viewModel);<\/span><\/p>\n<p>If you&rsquo;ve declared your view model as a function, use the syntax:<\/p>\n<p><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; ko.applyBindings(new viewModel());<\/span><\/p>\n<p>Note: In either case, it&rsquo;s critical to bind the view model after the page data has been loaded.&nbsp; You can do this by either declaring a script block at the end of the page:<\/p>\n<p><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &hellip;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;script&gt;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &hellip;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ko.applyBindings(viewModel);<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;\/script&gt;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;\/body&gt;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;\/html&gt;<\/span><\/p>\n<p>Or by applying the binding in a jQuery document.ready function or similar method:<\/p>\n<p><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;script&gt;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(function () {<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function viewModel() {<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &hellip;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ko.applyBindings(new viewModel());<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;\/script&gt;<\/span><\/p>\n<h2>Using Knockout Intellisense<\/h2>\n<p>Once you&rsquo;ve defined and applied your view model, you are ready to work with Knockout Intellisense.&nbsp;<br \/>Add a data binding to an HTML element by using the new &ldquo;db&rdquo; snippet.<\/p>\n<p>Place your cursor in an opening HTML tag, type &lt;space&gt;db&lt;tab&gt;&lt;tab&gt; and get:<\/p>\n<p>&nbsp;&nbsp;&nbsp; <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/0116.KO-RC-4.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/0116.KO-RC-4.jpg\" alt=\"\" width=\"200\" height=\"21\" border=\"0\" \/><\/a><\/p>\n<p>Next, begin typing the name of a binding (custom bindings<br \/>are fully supported) and a completion list will appear:<\/p>\n<p>&nbsp;&nbsp;&nbsp; <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/3377.KO-RC-5.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/3377.KO-RC-5.jpg\" alt=\"\" width=\"299\" height=\"66\" border=\"0\" \/><\/a><\/p>\n<p>Complete your binding with a colon. Press Control-J or Control-Space if you&rsquo;d like to see a full list of available values; applicable values will appear automatically once you start typing:<\/p>\n<p>&nbsp;&nbsp;&nbsp; <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/4214.KO-RC-6.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/4214.KO-RC-6.jpg\" alt=\"\" width=\"299\" height=\"117\" border=\"0\" \/><\/a><\/p>\n<p>Note that Knockout bindings are highlighted to make them stand out on a page:<\/p>\n<p>&nbsp;&nbsp;&nbsp; <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/2262.KO-RC-7.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/2262.KO-RC-7.jpg\" alt=\"\" width=\"513\" height=\"58\" border=\"0\" \/><\/a><\/p>\n<h2>Working with Bundling and Minification<\/h2>\n<p>To add Knockout to an existing project utilizing bundling and minification, such as an application created from the ASP.NET Web Forms Application template:<\/p>\n<ul>\n<li>Add the Knockoutjs package to the project as described above<\/li>\n<\/ul>\n<ul>\n<li>Open the file Scripts_references.js and drag Knockout-n.n.n.js onto the document window.&nbsp; This will add a script reference definition:<br \/><span style=\"color: #339966\">\/\/<span style=\"font-family: courier new,courier\">\/ &lt;reference path=&#8221;knockout-2.2.0.js&#8221; \/&gt;<\/span><\/span><\/li>\n<\/ul>\n<ul>\n<li>While you have _references.js open, ensure that your jQuery and other file names exactly match the installed file names.&nbsp; If you have updated packages, these may be out of sync and you will not benefit from accurate Intellisense.<\/li>\n<\/ul>\n<ul>\n<li>Open App_StartBundleConfig.css and add the following to the function &ldquo;RegisterBundles&rdquo;:<br \/>&nbsp;&nbsp;&nbsp;<span style=\"font-family: courier new,courier\">bundles.Add(new ScriptBundle(&#8220;~\/bundles\/knockout&#8221;).Include(&#8220;~\/Scripts\/knockout-*&#8221;));<\/span><\/li>\n<\/ul>\n<ul>\n<li>In an asp:PlaceHolder in the head of the master page, add:<br \/>&nbsp;&nbsp;&nbsp; <span style=\"font-family: courier new,courier\">&lt;%: Scripts.Render(&#8220;~\/bundles\/knockout&#8221;) %&gt;<\/span><\/li>\n<\/ul>\n<ul>\n<li>Remember to declare your view model and call ko.applyBindings after your page is loaded.<\/li>\n<\/ul>\n<h2>Caveats<\/h2>\n<p><strong>Bindings for &ldquo;foreach&rdquo;, &ldquo;with&rdquo; and template<\/strong><\/p>\n<p>Three special bindings, &ldquo;foreach&rdquo;, &ldquo;with&rdquo; and &ldquo;template&rdquo;, are not correctly implemented in WTE 1.2 RC.<\/p>\n<p>The &ldquo;foreach&rdquo; and &ldquo;with&rdquo; bindings should each establish a <em>binding context<\/em>, such that values within the context should refer to nested bindings. In the RC, the top-level context is used within the binding context rather than the nested context, so values presented in the value completion list are invalid.<br \/>This is a known RC issue and will be fixed in RTM.<\/p>\n<p>Variables such as $parent and $data will not point to the correct contextual object for Intellisense.&nbsp; Of course, these features work normally at runtime.<\/p>\n<p>The &ldquo;template&rdquo; binding should not show a list of values from the view model at all; rather, it uses an object which describes a named template and its associated data.&nbsp; In the RC, &ldquo;template&rdquo; displays an ordinary top-level context value list, which is invalid.<br \/>This is a known RC issue and will be fixed in RTM.<\/p>\n<p><strong>Containerless Control Flow Syntax<\/strong><\/p>\n<p>The &ldquo;if&rdquo;, &ldquo;ifnot&rdquo;, &ldquo;foreach&rdquo; and &ldquo;with&rdquo; bindings can be expressed in containerless flow control comments, like:<\/p>\n<p><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;!&#8211; ko foreach: myItems &#8211;&gt;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;li&gt;Item &lt;span data-bind=&#8221;text: $data&#8221;&gt;&lt;\/span&gt;&lt;\/li&gt;<\/span><br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; &lt;!&#8211; \/ko &#8211;&gt;<\/span><\/p>\n<p>WTE 1.2 RC does not evaluate these comments and they are ignored.&nbsp; Again, &ldquo;foreach&rdquo; and &ldquo;with&rdquo; do not establish binding contexts in this case and so the values in the value completion list will be invalid.<br \/>This is a known RC issue and will be fixed in RTM.<\/p>\n<p><strong>SPA Application Template<\/strong><\/p>\n<p>WTE 1.2 RC comes with a new MVC4 application template, theSingle Page Application:<\/p>\n<p>&nbsp;&nbsp;&nbsp; <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/8037.KO-RC-8.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/8037.KO-RC-8.jpg\" alt=\"\" width=\"306\" height=\"159\" border=\"0\" \/><\/a><\/p>\n<p>This template makes extensive use of Knockout in Views\/Home\/Index.cshtml.&nbsp; However, most of the binding expressions are nested with a binding context established by a &ldquo;foreach&rdquo; binding, so the value Intellisense provided is invalid.&nbsp; (See the earlier caveat.)&nbsp;<br \/>This is a known RC issue and will be fixed in RTM.<\/p>\n<h2>Troubleshooting<\/h2>\n<p>If you get no colorization of Knockout binding expressions, then the Knockout-n.n.n.js file was not found among the scripts or references. &nbsp;Double check the &ldquo;Loading Knockout&rdquo; instructions above.<\/p>\n<p>If you get colorization and binding name Intellisense, but not value Intellisense, then the ko.applyBindings call was not found, which establishes the view model to use.&nbsp; Double check the &ldquo;Defining a view Model&rdquo; instructions above.<\/p>\n<p>If you&rsquo;re having trouble with Bundling and Minification, more information is available at <a href=\"http:\/\/go.microsoft.com\/fwlink\/?LinkId=254726\">http:\/\/go.microsoft.com\/fwlink\/?LinkId=254726<\/a>.<\/p>\n<p>If you see the following values in the value completion list rather than the view model values that you expect:<\/p>\n<p>&nbsp;&nbsp;&nbsp; <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/4024.KO-RC-9.jpg\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2012\/12\/4024.KO-RC-9.jpg\" alt=\"\" width=\"261\" height=\"154\" border=\"0\" \/><\/a><\/p>\n<p>&hellip;then you have declared your view model as a function, but called<br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; ko.applyBindings(viewModel)<\/span><br \/>instead of<br \/><span style=\"font-family: courier new,courier\">&nbsp;&nbsp;&nbsp; ko.applyBindings(new viewModel())<\/span><br \/>You are not the first.&nbsp; \ud83d\ude42<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>WTE (Web Tools Extension)&nbsp;1.2 RC is part of the ASP.NET and Web Tools 2012.2 RC and it&rsquo;s available for download from http:\/\/www.microsoft.com\/download\/details.aspx?id=36053. Knockout Intellisense&nbsp;is an exciting new feature in WTE 1.2 RC.&nbsp; Knockout is a declarative JavaScript MVVM system for client-side data binding.&nbsp; See http:\/\/knockoutjs.com\/ for complete information and http:\/\/learn.knockoutjs.com\/ for tutorials.&nbsp;Knockout Intellisense allows you [&hellip;]<\/p>\n","protected":false},"author":433,"featured_media":58792,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[197],"tags":[7262,7276,7372,7423,7412,7319,7267,7268,7389],"class_list":["post-1964","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aspnet","tag-development","tag-intellisense","tag-javascript","tag-knockout","tag-visual-studio-2012","tag-visual-web-developer","tag-vwd","tag-web","tag-web-development"],"acf":[],"blog_post_summary":"<p>WTE (Web Tools Extension)&nbsp;1.2 RC is part of the ASP.NET and Web Tools 2012.2 RC and it&rsquo;s available for download from http:\/\/www.microsoft.com\/download\/details.aspx?id=36053. Knockout Intellisense&nbsp;is an exciting new feature in WTE 1.2 RC.&nbsp; Knockout is a declarative JavaScript MVVM system for client-side data binding.&nbsp; See http:\/\/knockoutjs.com\/ for complete information and http:\/\/learn.knockoutjs.com\/ for tutorials.&nbsp;Knockout Intellisense allows you [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/1964","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/433"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=1964"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/1964\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/58792"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=1964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=1964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=1964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}