GitHub reports that Patterns in Polymer is 59% JavaScript and 17% Dart. I am trying hard not to favor Dart too obviously and Dart dependencies do not make nearly the mess that their JavaScript counterparts do. Still, I need to keep up with the Dart version of the book, so tonight, I am going to get my change-history Polymer element re-written in Polymer.dart. If I am still feeling ambitious, I will swap out the
<polymer-localstorage>
element for <polymer-ajax>
Happily, this is Dart, so getting started is far easier. I create a pubspec.yaml file with my dependencies (Polymer and Polymer Elements):
name: change_history dependencies: polymer: any polymer_elements: git: https://github.com/ErikGrimes/polymer_elements dev_dependencies: unittest: anyThe git dependency is necessary because the most recent version published to Pub depends on a pre Dart 1.0 SDK. Hopefully the Git repository is not too bleeding edge (polymer-localstorage and polymer-ajax were both listed as ported in the versions on Pub).
After a quick
pub get
, I am ready to go.My first stop is
web/index.html
. I copy the JavaScript version directly and make the following Dart changes in the <head>
of the document: <!-- Load component(s) -->
<link rel="import" href="/packages/change_history/change-sink.html">
<link rel="import" href="/packages/change_history/store-changes.html">
<link rel="import" href="/packages/polymer_elements/polymer_localstorage/polymer_localstorage.html">
<script type="application/dart">export 'package:polymer/init.dart';</script>
<script src="packages/browser/dart.js"></script>
The underscore and extra patch in polymer_localstorage/polymer_localstorage.html
were unexpected. That aside, everything goes smoothly… until I try to re-implement the enteredView()
handling from JavaScript. For instance, if I define the <change-sink>
element as:<polymer-element name="change-sink" attributes="was current child"> <script type="application/dart" src="change_sink.dart"></script> </polymer-element>And add a corresponding
change_sink.dart
as:import 'package:polymer/polymer.dart'; import 'dart:html'; @CustomTag('change-sink') class ChangeSinkElement extends PolymerElement { @observable String was =''; @observable String current = ''; @observable Element child = null; ChangeSinkElement.created(): super.created() { style.backgroundColor = 'red'; print('created'); print(children.length); } ChangeSinkElement.enteredView() : super.enteredViw() { style.backgroundColor = 'green'; print("enteredView!"); } }Then I see the style change from the
create()
lifecycle event, but not the same change from the enteredView()
. Instead of green, the background color remains red:It takes me far too long to realize that I have simply cargo coded
enteredView()
here. I am defining a named constructor ChangeSinkElement.enteredView()
instead of a enteredView()
method. It really bother me that I can make obvious mistakes like that. Happily, once found, the fix is easy enough—convert it to a method: // ...
enteredView() {
super.enteredView();
child = children[0];
child.
onKeyUp.
listen(change);
}
// ...
Once I make it through silly things like that, the rest of the conversions goes smoothly. Unfortunately, messing around with <polymer-ajax>
will have to wait until tomorrow.Day #953
No comments:
Post a Comment