Last night I was able to get Polymer.dart and Angular.dart working together again. But I don't have them working together yet.
I have my
<x-pizza>
Polymer element working within an Angular partial:But I do not have the two communicating. When I originally wrote the Angular & Polymer chapter in Patterns in Polymer, I was able to reflect changes from the Polymer element back into the Angular application through the use of angular_node_bind. That was a long time ago, let's see if it still works.
Before diving into it, I need to get Angular setup properly. I had remove the variable binding element last night from my partial:
<h3>Oooh! Let's make beautiful pizza together</h3> <pre>{{ pizzaState }}</pre> <p> <x-pizza pizzastate="[[ pizzaState ]]"></x-pizza> </p>With that
<pre>
element bound to the pizzaState
property, I get errors like:No getter for 'pizzaState'. STACKTRACE: #0 StaticClosureMap.lookupGetter (package:angular/core/parser/static_closure_map.dart:15:25) #1 DynamicParserBackend.newAccessScope (package:angular/core/parser/dynamic_parser.dart:112:38) #2 DynamicParserImpl.parseAccessOrCallScope (package:angular/core/parser/dynamic_parser_impl.dart:257:67) #3 DynamicParserImpl.parsePrimary (package:angular/core/parser/dynamic_parser_impl.dart:239:36) #4 DynamicParserImpl.parseAccessOrCallMember (package:angular/core/parser/dynamic_parser_impl.dart:193:30) ...This turns out to be caused by omitting the partial from the list of Angular files in my application's
pubspec.yaml
:name: angular_example dependencies: angular: any polymer: any angular_node_bind: any dependency_overrides: args: '>=0.10.0 <0.12.0' code_transformers: '>=0.1.4+2 <0.3.0' html5lib: '>=0.10.0 <0.13.0' dev_dependencies: unittest: any transformers: - angular: html_files: - web/partials/custom.html - polymer: entry_points: - web/index.html - test/index.htmlWith this “custom” pizza partial listed, my error are fixed. But the bound attribute is still not reflected back into the Angular application.
To make that work, I need no changes to my
<x-pizza>
backing class definition:@CustomTag('x-pizza') class XPizza extends PolymerElement { // ... @published String pizzaState; // ... }I find that interesting because it does not appear to need the
@PublishedProperty(reflect: true)
annotation that I would have expected. The only change I that I need is using the angular_node_bind directive in my app:// ... import 'package:angular_node_bind/angular_node_bind.dart'; // ... main() { initPolymer().run((){ var app = new PizzaStoreApp() ..bind(NodeBindDirective) ..bind(NgRoutingUsePushState, toValue: new NgRoutingUsePushState.value(false)) ..bind(RouteInitializerFn, toValue: storeRouteInitializer); applicationFactory() .addModule(app) .run(); }); }Happily, that directive still works just fine. I continue to bind the Angular
pizzaState
variable to the Polymer element's pizzastate
attribute in the template:<pre>{{ pizzaState }}</pre> <p> <x-pizza pizzastate="[[ pizzaState ]]"></x-pizza> </p>With the double-square brackets serving as angular_node_bind's way of watching properties. And it works:
When the Polymer updates its
pizzastate
, Angular sees the change and updates its pizzaState
variable, which is reflected in the <pre>
element from the Angular template. Nice!The WARNING on the page is Polymer's way of telling me in development mode that it was unable to interpret the
<ng-view>
element from Angular. I can certainly live with that since Polymer was not suppose to interpret it anyway. I think I am nearly satisfied with the solution to the point that I can again include it in the book.Day #196
The newest version of angular-dart (0.14.0) should support binding with polymer-dart. See: http://blog.angulardart.org/2014/08/angulardart-0140-symbiotic-meerkat-is.html
ReplyDeleteOoh! I had completely forgotten about that. Will give it a whirl. Thanks!
Delete