HI all
Love the polymer code. I have been using Polymer and typescript in my
latest project and it has been working very well, nice looking app is
forming up and work in all the main browsers ie 10,11, firefox, Chrome,
etc. Still have tweaking work to get it to work better on window phone 8.1,
android, and iphone, but it looks better than I thought it would with
almost no effort
So first a few quirks I have seen. First one is that the core-animation
only works in chrome, firefox and ie have issues about a play member not
defined and some warning about a playbackrate is going away. I assume this
is just out of sync with the latest webanimation updates
one is with re-sizeing in a component. Honestly I wish the web community
would just add the silly resize event to a element and move on, vs all this
hackery. Anyway I use the Polymer.CoreResizable mixing. It seems to work
except for when the element is hidden and shown. Maybe I am doing something
wrong, but I hide and show via style.display style. I am not getting the
core-resize event in this case. other than that it works fine and is a
great help.
Along with that i was trying to find a way to get this work and i was
trying out different idea's. I found that i could add a function:
clientWidthChanged(oldval) {}
and this worked great in IE and firefox. The event when off perfectly at
the correct points in time, and happened only once. It worked with hiding
and showing or having some parent element getting a new size. However this
did nothing in chrome. Just an observation, as this would be a great and
simple way to solve the problem in my view that is a little simpler that
the mixin way.
Last of all I wanted to post my ugly, incomplete but mostly there solutions
to getting typescript to work in case others wanted to use it and maybe
have someone make it better, extra...
to do this I have two files one to deal with basic Polymer definitions and
one to deal with creating a typescript class. I should point out that
Polymer does not work on a class based design, but one of behaviors. This
is not a big deal, but leads to what looks like a little extra work from a
purely classed based point of view. Also I should add that typescript is
still working on dealing with the idea of mixins better, so you will see
some hacks i have to deal with the re-sizing mixins I used as there has to
be some definition for them. (This could be solved some other ways.. again
i was hacking a little to get it working)
First the main polymer.d.ts file as it is at the moment ( again could be
done better, probably has bugs, but the API was sort of a self-discovery at
time as documentation is changing, and i am not a polymer developer )
///////////
declare module Polymer {
export interface PolymerOptions {
// definition
publish?: Object;
computed?: Object;
// object mapping variable names to functions name
observe?: Object;
// life time API
created?: () => void;
ready?: () => void;
attached?: () => void;
domReady?: () => void;
detached?: () => void;
attributeChanged?: (attrName: string, oldVal: any, newVal: any) =>
void;
}
}
//declare class Polymer {
interface Polymer {
importElements(node: Node, callback: Function);
import(url: string, callback?: () => void): void;
mixin(target: any, ...obj1): any;
waitingFor(): Array<string>;
// should be an "integer" for milliseconds
forceReady(timeout: number): void;
(tag_name: string, prototype: Polymer.PolymerOptions): void;
(tag_name: string, prototype: any): void;
(prototype: Polymer.PolymerOptions): void;
(): void;
// hacks for mixins
CoreResizer: any;
CoreResizable: any;
}
declare var Polymer: Polymer;
// these are for web-animation API... should be moved to own file
declare class Animation {
constructor(targetElement: HTMLElement, effect: any, options: any);
}
declare module document {
export interface timeline {
play(animation);
}
}
/////////////////
Then the PolymerTS.ts file which i what I used to get a typescript class to
work. The Adapter function allows mixing and class to be defined correctly.
Might be better ways to do this, but I not java script language expert
///////////////////
/// <reference path="Polymer.d.ts" />
export function contains(obj: any, arr: Array<any>) {
for (var i = 0; i < arr.length; i++)
{
if (arr[i] === obj) {
return true;
}
}
return false
}
module PolymerTS {
export class PolymerBase implements Polymer.PolymerOptions {
$: any; //polymer object for elements that have an ID
$el: HTMLElement; // my addition to have easy "typed" point to this
as HTMLElements
Constructor() {}
ready() {
//console.log("Base ready");
this.$el = <any>this;
this.Constructor();
}
////////////////////////
// for built in stuff to Polymer
// inargs is the [args] for the callback.. need to update function
def
async(inMethod: () => void, inArgs?: Array<any>, inTimeout?:
number) { }
job(jobName: string, inMethod: () => void, inTimeout?: number) { }
fire(eventName: string, details?:any, targetNode?:any,
bubbles?:boolean, cancelable?:boolean) { }
asyncFire(eventName: string, details?: any, targetNode?: any,
bubbles?: boolean, cancelable?: boolean) { }
cancelUnbindAll() { }
// these are mix in API's.. hacky way to deal with them at the
moment.
resizableAttachedHandler;
resizableDetachedHandler;
}
function applyMixins(obj: any, mixins: any[]) {
mixins.forEach(mixin => {
for (var i in mixin) {
if (mixin.hasOwnProperty(i)) {
obj.prototype[i] = mixin[i];
}
}
});
}
// this allows polymer to work correctly
export function Adapter(t: any, ...mixins) {
var ret = {};
var poly_func = ["async", "job", "fire", "asyncFire",
"cancelUnbindAll"];
if (mixins) {
applyMixins(t, mixins);
}
var o = new t();
for (var i in o) {
if (!contains(i, poly_func))
ret[i] = o[i];
}
return ret;
}
}
//////////////////
oh and the component file polymer.html
/////
<link rel="import" href="../../components/polymer/polymer.html">
<script src="PolymerTS.js"></script>
////
Again it is a start an has been enough for me to do some work i needed to
do rather quickly.
A quick example of how this would look like.. a simple component...
// component html file
<link rel="import" href="../polymerTS/polymerTS.html" />
<polymer-element name="my-test">
<template>
<style>
</style>
<p>{{someValue}}</p>
<content select="p"></content>
<content></content>
</template>
<script src="my-test.js"></script>
</polymer-element>
/////
The typescript file...
/////////////
class MyTest extends PolymerTS.PolymerBase {
someValue: string;
get publish() {
return {
someValue:"default value"
}
}
// replaces the normal constructor() call
Constructor() {
}
joe() {
return "joe";
}
}
Polymer("my-test", PolymerTS.Adapter(MyTest));
////////////
Very simple example ( more of a starter template).
A few notes on this. I added a $el to access "this" as an HtmlElement type.
This way you don't have to try to cast "this" manually. This also prevent
the need to try to deal with the issue with not being able to inherit from
HtmlElement in the current typescript drops. Maybe this will be fixed in a
future drop and the object can extend from this type correctly in the
typescript sense.
I hope this is helpful. Love Polymer, look forward to improvements. It is
really a system i see that can be used by teams of people making complex
webs apps.
Follow Polymer on Google+: plus.google.com/107187849809354688692
---
You received this message because you are subscribed to the Google Groups
"Polymer" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/polymer-dev/0638fee7-0372-4277-8a19-50aec60ee66d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.