Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Meteor Template Inside Script Tag

Tags:

meteor

I want to fill a script type="text/html tag with a Meteor template.

So, this is an odd thing to do, I know. Half the reason I want to do this is because Cloud9 can't tell the difference between JS script tags and HTML script tags, and its syntax highlighting and tag-completion breaks when you try to write HTML in script tags. The other half of me is just curious to see if this is possible, because an ugly-as-sin workaround exists.

So this:

<body>
    <script type="text/html" id="test">
        {{> test}}
    </script>
</body>

<template name="test">
    <span>Test</span>
</template>

Produces this:

<script type="text/html" id="test">
    <!--label:YRgyaMH8-->
</script>

Anyone have a way to force it to render the template, instead of what looks like evaluate the name as a comment?

like image 914
Kyeotic Avatar asked Dec 01 '25 14:12

Kyeotic


1 Answers

Submitting another answer b/c I'd like to keep my previous one just for the records. I think this approach will work better though.

Inside your html, you're going to define two sections. The first is where you're going to place your template code. It will go inside a comment inside a plain div tag. The second is where the template will be placed for Knockout to consume. It looks like this:

<template name="koTemplate">
    <div id="myTemplate">
        <span>Here is my template <a href="#">with children</a></span>
    </div>

    <script type="text/html" id="test"></script>
</template>

Then in your client JS code, you're going to add a callback to run when the template is rendered

Template.koTemplate.rendered = function () {
  // Get the first node, then get the content inside of it
  var templateHtml = this.firstNode.innerHTML;

  // Remove the element so it doesn't get rendered
  this.firstNode.parentNode.removeChild(this.firstNode);
  // another option is to surround the contents inside the template w/comments, but that loses syntax highlighting

  // Get the target node for placing the template in
  var templateNode = this.lastNode;

  // place the content from the original node to the target node
  templateNode.innerHTML = templateHtml;
};

This will basically get the content of the template, remove the template, then place it inside the script tags. The result will look like:

<script type="text/html" id="test">
    <span>Here is my template <a href="#">with children</a></span>
</script>
like image 118
Kevin Lamping Avatar answered Dec 04 '25 12:12

Kevin Lamping



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!