While mucking around in 0.9 Polymer.dart, I was surprised that the
@initMethod annotation seemed to have some effect on the code. I had thought it was a 0.10 pre-release annotation that helped Polymer.dart determine code isolates in which to run Polymer-related code—in particular which methods were main entry points. I never did figure out what
@initMethod did in 0.9 and I am unsure what it does now that 0.10 is here and has dropped some of the isolate-related features. So tonight I set out to figure out what @initMethod does and if I need to be aware of it in Patterns in Polymer.Digging through the source code in the book repository, I find that I did use the
@initPolymer annotation on some Polymer code that needed a main() entry point in addition to Polymer initialization. This was 0.10 pre-release code, so it loaded the Polymer library differently and initialized Polymer differently. I had to place the @initMethod annotation on the main() entry point to get Polymer to invoke it during the initialization process:import 'package:polymer/polymer.dart';
@initMethod
main() {
// Code here...
}In this pre-release, I did not have to invoke initPolymer() but that is back now that official Polymer.dart 0.10 is here. So what does the @initMethod annotation do in official 0.10? Throw an exception apparently.If I add
initPolymer() to the main() entry point:import 'package:polymer/polymer.dart';
@initMethod
main() {
initPolymer();
// ...
}Then reload in Dartium, I get an exception:Exception: Initialization was already done.I am not certain where that exception is actually thrown (the debug version of Dartium has gone missing), but removing the
@initMethod annotation eliminates the exception and, if I have setup my page correctly:<!DOCTYPE html>
<html lang="en">
<head>
<link rel="import" href="packages/polymer/polymer.html">
<link rel="import" href="packages/changes_from_outside/elements/hello-you.html">
<script type="application/dart" src="main.dart"></script>
</head>
<body>
<div class="container">
<hello-you><!-- ... --></hello-you>
</div>
</body>
</html>
Then everything works including the code in the main() entry point and in the Polymer element.That is obviously not the right way to use
@initPolymer, so what is? Well, I finally read the documentation, which states that initPolymer() will:...for each library included transitively from HTML and HTML imports, register custom elements declared there (labeled withThat makes it seem like@CustomTag) and invoke the initialization method on it (top-level functions annotated with@initMethod).
@initMethod will invoke a method defined in the actual Polymer code. So I give that a try:import 'package:polymer/polymer.dart';
@initMethod
bob() {
print('Go talk to bob.');
}
@CustomTag('hello-you')
class HelloYou extends PolymerElement {
// Normal Polymer code here...
}
And indeed that actually works. When I load my application, the code in the main() entry point continues to work as does the Polymer code. And if I check the console, I see:
So it seems that
@initMethod can be used for some register-time code evaluation. I am unsure if this is meant for external custom element authors or just something for internal Polymer.dart authors. I am also unsure if the meaning will end up changing in the future. Still, it seems like something that might come in pretty handy. Day #84
No comments:
Post a Comment