I messed around with Web UI components a while back. Since they have been replaced by Polymer, and since I have need of a custom component, this seems an opportune time to play around with both.
A week or so ago, we got faux-
<script> support added to ICE Code Editor. The tag looked like:<script type="text/ice-code" src="embed_a.html" data-line-number="49"></script>A little bit of Dart code scanned the HTML for
text/ice-code <script> tags, replacing them with embedded versions of the code. This seems an ideal application of Polymer.Instead of faux-
<script> tags, I would like a real <ice-code-editor> tag along the lines of:<ice-code-editor src="embed_a.html" line-number="49"></ice-code-editor>So...
First, I add polymer as a dependency for the ICE:
name: ice_code_editor # ... dependencies: # ... polymer: anyThen install the newly added dependency:
➜ ice-code-editor git:(embedded) ✗ pub install Resolving dependencies................................................................................. Downloading polymer 0.7.3+1 from hosted... Downloading barback 0.7.3+1 from hosted... Downloading csslib 0.7.3+1 from hosted... Downloading shadow_dom 0.7.3+1 from hosted... Downloading polymer_expressions 0.7.3+1 from hosted... Downloading observe 0.7.3+1 from hosted... Downloading yaml 0.7.3+1 from hosted... Downloading html5lib 0.7.3+1 from hosted... Downloading html_import 0.7.3+1 from hosted... Downloading mutation_observer 0.7.3+1 from hosted... Downloading source_maps 0.7.3+1 from hosted... Downloading utf 0.7.3+1 from hosted... Downloading mdv 0.7.3+1 from hosted... Downloading custom_element 0.7.3+1 from hosted... Dependencies installed!Polymer requires two things to work. The HTML
<polymer-element> template, which I create in a separate ice_code_editor.html file:<polymer-element name="ice-code-editor" attributes="src,line-number">
<template>
<h1>The src is {{src}}</h1>
<content></content>
</template>
<script type="application/dart" src="ice_polymer.dart"></script>
</polymer-element>I then create the referenced ice_polymer.dart file as:import 'package:polymer/polymer.dart';
import 'dart:html';
import 'package:ice_code_editor/ice.dart' as ICE;
@CustomTag('ice-code-editor')
class IceCodeEditorElement extends PolymerElement with ObservableMixin {
@observable String src;
void created() {
super.created();
var container = new DivElement()
..style.width = '600px'
..style.height = '400px';
print('here: ${src}');
print(host.text);
host.children.add(container);
// create ice here
}
}The observable stuff should give me access to the necessary src and line-number attributes. Except they don't.When I try to use my custom element from my main web page:
<head> <link rel="import" href="ice_code_editor.html"> <script src="packages/polymer/boot.js"></script> </head> <body> <p> asdf asdf as df sadf as df asdf </p> <ice-code-editor src="embed_a.html" line-number="49"></ice-code-editor> <p> asdfsadfasd sadf asdf sdf asdf a sdfsfd </p> </body>I get an empty value for the src.

This is apparently a known bug in Polymer.dart. Unfortunately, it is something of a show stopper for me in this case.
I can kinda-sorta make it work by embedding the attributes in the content of my custom tag:
<ice-code-editor>src="embed_a.html" line-number="49"</ice-code-editor>I can then parse that information out in the
create() method of my PolymerElement:@CustomTag('ice-code-editor')
class IceCodeEditorElement extends PolymerElement with ObservableMixin {
@observable String src;
void created() {
super.created();
// ...
Map attrs = {};
host.text.split(" ").forEach((attr) {
var pair = attr.split('=');
attrs[pair[0]] = pair[1];
});
// Setup ICE here...
}
}But that's pretty ugly. Bother.Somewhat frustrated, I call it a night here. I am unsure if there is much point in pushing further with this until that bug is resolved. It seems close to what I want, but it may be best to wait for resolution of that issue before making any final decisions.
Day #884
what happens if src has a default value; I remember seeing the examples and a comment on initialising observable with values; but I could be going crazy
ReplyDeleteInstead of null, I get the value to which it was initialized, but not the value set in the custom element attribute.
DeleteI think I saw that example somewhere as well, but it may have been a patch for polymer.dart. I'm gonna see if I can dig that up tonight and give it a try.