I had a good time updating and improving
<ice-code-editor>, the Polymer version of the ICE Code Editor. I even have a nice demo page for my efforts. As cool as that was, I was unable to explore one aspect of the Polymer that I would have liked: importing config directly into the Polymer's <content>.So tonight, I would like to see if I can import configuration into a Polymer instance. And instead of a complex Polymer that wraps a large codebase adding too many moving parts to the equation, I start with a small test case. What I am hoping to get working tonight it the ability to import configuration when using a Polymer. For a simple
<hello-you> tag, that would be in the form of the usual Polymer usage plus a <link> tag inside the tag: <head>
<!-- 1. Load the polyfills required to make the platform work -->
<script src="bower_components/platform/platform.js"></script>
<!-- 2. Load component(s) -->
<link rel="import" href="scripts/hello-you.html">
</head>
<body>
<div class="container">
<hello-you>
<link rel="import" href="scripts/config2.json">
</hello-you>
</div>
</body>Something that is inside a Polymer like that can be distributed into the rendered Polymer if the Polymer's template contains a <content> tag. For tonight's purposes, I stick with a version that does not include a <content> tag in the template:<link rel="import" href="../bower_components/polymer/polymer.html">
<polymer-element name="hello-you">
<template>
<h2>{{hello}} {{your_name}}</h2>
<p>
<input value="{{your_name}}">
<input type=submit value="{{done}}!" on-click="{{feelingLucky}}">
</p>
<!-- ... -->
</template>
<script>
Polymer('hello-you', {
your_name: '',
hello: 'Hello',
done: 'Done',
instructions: 'Introduce yourself for an amazing personalized experience!',
feelingLucky: function() { /* ... */ }
});
</script>
</polymer-element>To load the configuration, I need to add a ready() lifecycle method to this Polymer. It needs to the query the element for all <link> tags that contain JSON configuration. If there are any, it needs to parse the JSON and update the this.hello attribute for a configured greeting value. This should work: ready: function() {
var links = this.
querySelectorAll('link[rel=import]').
array().
filter(function(el) {
return el.href.match(/config.*\.json/)
});
if (!links.length) return;
var json = links[0].import.textContent.replace(/import/, '');
var config = JSON.parse(json);
if (config['greeting'] !== undefined) this.hello = config['greeting'];
},
The only trick in there is to remove the word “import” from the text content of the <link> tag's import. I am unsure why this is there, but removing it leaves me with just the JSON, which can be parsed.If I create a JSON config file with the following:
{
"greeting": "Howdy"
}Then I it works! When I load the page with my small test case, I get the configured “Howdy” greeting instead of the default “Hello”:
And, if I comment out the configuration import:
<hello-you>
<-- link rel="import" href="scripts/config2.json" -->
</hello-you>Then I get the default “Hello” greeting:

So this would seem legit! There are still some questions to answer. Most pressing is how this would work if I need to distribute nodes and import configuration. I also need to see if I can get this working in Dart. But, for a first attempt, this seems promising.
Day #989
No comments:
Post a Comment