观察聚合物的含量变化
Observing Content Changes in Polymer
我正在尝试实现一个新的Polymer自定义元素。但是,我希望在元素的内容发生更改时激发一个自定义事件。到目前为止,我的代码如下:
<link rel="import" href="../../lib/polymer/polymer.html">
<polymer-element name="dnd-dropdown" attributes="field">
<template>
<link rel="stylesheet" href="dnd-dropdown.css">
<div id="c">
<div class="dndValue"><content></content></div>
<div class="dndTitle">{{field}}</div>
</div>
</template>
<script>
Polymer({
field: "...",
ready: function () {
this.onMutation(this, this.contentChanged);
},
contentChanged: function (e) {
console.log("contentChanged event fired");
console.log("event = %o", e);
}
});
</script>
</polymer-element>
我的理论是,只要dndValue节点发生变化(即元素的内容发生变化),onMutation就会触发,并打印两条控制台消息。然而,当我在Chrome中的F12开发工具中更改元素时,什么都没有发生。
观察聚合物含量变化的最佳方法是什么?
聚合物1.7的更新方法:
使用以下模板
<template>
<content id="myContent"></content>
</template>
您可以使用观察节点变化
attached: function() {
Polymer.dom(this.$.myContent).observeNodes(this._nodesChanged);
},
_nodesChanged: function() {
var elements = this.$.myContent.getElements();
for(var i = 0; i < elements.length; i++) {
$(elements[i]).on("change", function(){
this.doStuffWithChangedNodes();
}.bind(this));
}
this.doStuffWithChangedNodes();
},
doStuffWithChangedNodes: function() {
var elements = this.$.myContent.getElements();
// you can loop and work with each element
...
}
我在几乎每一次可能性迭代后都会遇到这个解决方案,所以这是一个经验的"它有效"答案,而不是一个明确的"这是最好的方法"类型的答案。
简短版本:使用自定义MutationObserver。
这是我最终得到的代码:
ready: function () {
var that = this, observer = new MutationObserver(function (mutations) {
console.debug("Firing textChanged event on field ", that.field, " new value ", mutations[0].target.textContent);
this.fire("textChanged", { field: this.field, value: mutations[0].target.textContent });
}).observe(this, { childList: true, subtree: true, characterData: true });
},
当从Internet Explorer(技术预览)运行时,总共观察到3个childList突变。当从Chrome(它对自定义元素有很好的支持)运行时,只观察到一个characterData突变。因此,我只为第一个似乎总是抓住"正确的东西"的事件而启动新事件。考虑到不同的实现,这可能有点脆弱。
我不知道这是如何与Firefox或Opera配合使用的。Caniuse.com表示,除了Opera Mini之外,其他所有领域都支持MutationObserver,所以我可以推测它在Opera Minis中不会起作用。
相关文章:
- 用于搜索的聚合物嵌套绑定
- 单击页面上的链接后高度发生变化
- 聚合物0.5.5:核心列表中的条件模板和/或模板动态参考
- React redux初始化功能,无论状态变化如何
- 角度ng变化或ng点击选择can'不起作用
- 每个选择器的Jquery css颜色都在变化,但字体大小却没有变化
- Rubaxa可与聚合物进行排序/拖放不起作用,具体取决于显示器:
- JS幻灯片与CSS背景颜色变化
- 如何在模板聚合物中使用元素函数
- 聚合物dom重复问题
- 聚合物是一个框架而不是一个库.如何模块化地使用web组件
- 观察聚合物的含量变化
- 如何观察聚合物元素属性值从索引.html的变化
- 聚合物动态变化数据阵列
- 如何正确地通知聚合物中兄弟姐妹之间的数据变化
- 当聚合物元素中的布尔属性发生变化时,如何用sort重新运行dom repeat
- 聚合物1.0阵列观察者的结合变化
- 聚合物:如何关注内容的变化属性
- 选择性地发布聚合物元素的属性变化
- dom-repeat中元素的聚合物变化不反映在父数组中