Привязка значения между родительским и дочерним элементом, где дочерний элемент создается с помощью javascript
Используя полимер, кто-нибудь знает, как связать значение между родительским и дочерним элементом?
Ниже моя попытка, однако она не работает.
Примечание: child-component
необходимо создать с помощью JavaScript.
<dom-module id="host-component">
<template>
<div>{{sharedValue}}</div>
<div id="childComponentContainer">
<!-- CHILD-COMPONENT GETS CREATED HERE -->
</div>
</template>
<script>
Polymer({is:'host-component',
properties:{
sharedValue:{
type: String,
notify:true,
observer: 'sharedValueChanged'
}
},
attached: function(){
var newElement = document.createElement('child-component');
Polymer.dom(this.$.childComponentContainer).appendChild(newElement);
},
sharedValueChanged:function(d){
console.log(d, ", said the child");
}
});
</script>
</dom-module>
<dom-module id="child-component">
<template>
<input is="iron-input" bind-value="{{sharedValue}}" />
</template>
<script>
Polymer({is:'child-component',
properties:{
sharedValue:{
type: String,
notify:true,
reflectToAttribute:true,
}
},
});
</script>
</dom-module>
Спасибо :)
1 ответ:
После повторного чтения документации Polymer (много раз) я нашел раздел о , как работают события двусторонней привязки данных, где при каждом изменении Polymer запускает событие DOM. Из этого я придумал работу вокруг ниже.
Вы заметите, что эта версия также имеет двустороннюю привязку, так что хост может изменить значение дочернего элемента, а ребенок может изменить значение хоста!
<dom-module id="host-component"> <template> <div>Host: <span>{{sharedValue}}</span></div> <div>Host: <span><input is="iron-input" bind-value="{{sharedValue}}" /></span></div> <div id="childComponentContainer"> <!-- CHILD-COMPONENT GETS CREATED HERE --> </div> </template> <script> Polymer({is:'host-component', properties:{ sharedValue:{ type: String, notify:true, value: "Unchanged", observer: 'sharedValueChanged' } }, attached: function(){ this.$.childComponent = document.createElement('child-component'); var host = this; //Listens to the child's sharedValue. When changed it will update host's sharedValue. this.$.childComponent.addEventListener("shared-value-changed", function(e){ host.sharedValue = this.sharedValue; }); Polymer.dom(this.$.childComponentContainer).appendChild(this.$.childComponent); }, //Observes the hosts's sharedValue. When changed it will update child's sharedValue. sharedValueChanged: function(value){ if (this.$.childComponent) { this.$.childComponent.sharedValue = value; } } }); </script> </dom-module> <dom-module id="child-component"> <template> <div>Child: <span>{{sharedValue}}</span></div> <div>Child: <span><input is="iron-input" bind-value="{{sharedValue}}" /></span></div> </template> <script> Polymer({is:'child-component', properties:{ sharedValue:{ type: String, notify:true, value:"Unchanged", reflectToAttribute:true, } } }); </script> </dom-module>