我刚刚开始学习聚合物。这是我的聚合物元素的通用版本:
<polymer-element name="my-element">
<template>
<style>
:host {
position:absolute;
width: 200px;
height: 100px;
background-color: green;
}
</style>
<p>my element</p>
<content id="first-in"></content>
<content id="second-in"></content>
</template>
<script>
Polymer('my-element', {
domReady: function() {
alert(this.children[0].getAttribute('title'));
//this returns the value I want to observe
}
});
</script>
<polymer-element>
内容标记都填充了另一个自定义元素(再次略微简化):
<polymer-element name="in-element" attributes="title">
<template>
<style>
...
</style>
<p>{{title}}</p>
</template>
<script>
Polymer('in-element', {
title: 'me'
});
</script>
<polymer-element>
我希望能够做的是当(任意)元素(放入内容标记中)中的title属性发生更改时(通过单击事件或其他任何内容)调用my元素中的函数。我不确定如何使用observe来访问它,或者我是否需要使用mutationObserver等。这是如何完成的/是否可能?
答案 0 :(得分:8)
聚合物的数据绑定系统无法观察到像title
这样的原生属性(例如Object.observe()
[info])。 避免使用通常是一个好主意。
在您的示例中,我已将title
更改为mytitle
并将其与reflect: true
一起发布,以便属性值反映回属性。这样您就可以完全避免.getAttribute()
,只需检查元素内的.mytitle
即可。您还可以在绑定中使用{{mytitle}}
。
你可以通过变异观察者[1]来做到这一点。 Polymer提供onMutation
来监视孩子,但是你想要监视孩子的属性。为此,你需要一个纯MO:
ready: function() {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(m) {
if (m.target.localName == 'in-element') { // only care about in-element
console.log(m.attributeName, m.oldValue, m.target.mytitle);
}
});
});
// Observe attribute changes to child elements
observer.observe(this, {
attributes: true,
subtree: true,
attributeOldValue: true
});
}
演示:http://jsbin.com/doxafewo/1/edit
在domReady()
中,我还将this.children[0]
的提醒更改为this.$.firstin.getDistributedNodes()[0].mytitle
。使用getDistributedNodes()
会更好,因为您可以确保节点实际通过<content>
插入点[2]。
答案 1 :(得分:-1)
每个属性都有一个观察者。所以在你的情况下它应该是这样的。虽然有2种不同的实现,但有一种属性名称作为函数的第一个参数。
Polymer('in-element', {
title: 'me',
titleChanged: function(oldVal, newVal) {
// do something
}
});