Consider the following Polymer custom element:
<dom-module id="test-element">
<template>
<input type="text" value="{{value}}">
<button>Reset</button>
</template>
<script>
Polymer({
is: 'test-element',
properties: {
'value': {
type: String,
reflectToAttribute: true,
notify: true,
value: null
}
}
});
</script>
</dom-module>
I use this custom element in my index.html as follows:
<html>
<head>
<script type="text/javascript" src="bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
<link rel="import" href="test-element.html">
<title>Test App</title>
</head>
<body>
<test-element value="test"></test-element>
</body>
</html>
I believe I have declared the value
property as a two-way binding (notify: true
); yet when I click on the input and type in some text (say, "foo"
), it is not reflected in the model (i.e. a call to document.querySelector('test-element').value
returns the value I set in index.html, "test"
). Interestingly enough, the value
attribute of the input changes correctly, but the value property of my test-element does not. What am I missing?
I should also note that a call to document.querySelector('test-element').setAttribute('value', 'bar')
works properly.
You need to change this:
<input type="text" value="{{value}}">
into
<input type="text" value="{{value::input}}">
try here. This says for polymer to listen to input's events. Explained here (not very clearly IMO).
First note that the notify
and reflectToAttribute
fields on the value
property tell it how to react to it's parent not about how to bind to a child.
IOW, notify: true
means to make value
two-way bindable from the outside, not from the inside. reflectToAttribute: true
tells Polymer to write value
to an attribute every time it changes (not good for performance).
When you do a binding like <x-element foo="{{value}}">
, it's x-element that decides if foo
is two-way bindable.
Native elements like input
do not have two-way binding support built in, instead use Polymer's event-observer syntax to two-way bind to an input. Like so
<input value="{{value::change}}">
.
This tells Polymer to update this.value
from input.value
whenever the input
fires a change
event.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With