嵌套组件中的聚合物 1.0 事件触发
polymer 1.0 event firing among nested components
我在 Polymer 1.0 中遇到与 Web 组件嵌套结构内的事件传播相关的问题。特别是,我试图通过位于其本地 DOM 中的名为 wc-split-rule
的其他组件的集合来动态配置名为 wc-split
的 Web 组件。以下代码片段显示了正确的使用形式:
<wc-split-test>
<wc-split>
<wc-split-rule key="{{k1}}" ...></wc-split-rule>
<wc-split-rule key="{{k2}}" ...></wc-split-rule>
<wc-split-rule key="{{k3}}" ...></wc-split-rule>
</wc-split>
</wc-split-test>
如前例所示,目的是向 wc-split
组件提供每个 wc-split-rule
组件中 key
属性的值。由于我们需要动态重新配置功能,架构策略首先在每次满足 key
属性的更改时触发一个事件,然后通过冒泡到达 wc-split
组件来促进这些更改,该组件会处理它们。
以下方法在 [1] 在具有文字值的纯 HTML 上下文中和 [2] 在具有数据绑定值的组件模板中进行测试时可以正常工作。然而,[3] 当它在组件模板中使用文字值进行测试时,不会促进更改。似乎忽略了事件传播或 wc-split
中定义的侦听器未捕获事件:
<wc-split-test>
<wc-split> <!-- does not work -->
<wc-split-rule key="k1" ...></wc-split-rule>
<wc-split-rule key="k2" ...></wc-split-rule>
<wc-split-rule key="k3" ...></wc-split-rule>
</wc-split>
</wc-split-test>
以下清单显示了两个组件的实现 [https://goo.gl/OkU9jQ]:
<dom-module id="wc-split-rule">
<script>
Polymer({
is: 'wc-split-rule',
properties: {
key : {
type: String,
reflectToAttribute: true,
notify: true,
value: '',
observer: '_changed'
},
},
_changed: function (){
this.fire('wc-split-rule', {
key : this.key,
});
}
});
</script>
</dom-module>
<dom-module id="wc-split">
<template>
<content></content>
</template>
<script>
Polymer( {
is: 'wc-split',
listeners: {
'wc-split-rule': 'onRule'
},
ready: function(){
...
},
onRule: function (event, context){
... // this is executed in test [1] and [2] NOT in [3]
}
});
</script>
</dom-module>
<dom-module id="wc-split-test">
<template>
<wc-split id="split">
<wc-split-rule key="e1"/>
</wc-split>
</template>
<script>
...
</script>
</dom-module>
令人惊讶的是,Polymer 0.5 上的相同代码对于每个测试场景都能正常工作 [https://goo.gl/CHV3JE]:
<polymer-element name="wc-split-rule">
<script>
Polymer('wc-split-rule', {
publish : {
key : '',
},
observe: {
key : '_changed',
},
_changed: function (){
this.fire('wc-split-rule', {
key : this.key,
});
}
});
</script>
</polymer-element>
<polymer-element name="wc-split">
<template>
<div on-wc-split-rule="{{onRule}}">
<content select="wc-split-rule"></content>
</div>
<content></content>
</template>
<script>
Polymer('wc-split', {
ready: function(){
...
},
onRule: function (event, context){
... // this is always executed
}
});
</script>
</polymer-element>
<polymer-element name="wc-split-test">
<template>
<wc-split id="split">
<wc-split-rule key="e1"/>
</wc-split>
</template>
<script>
...
</script>
</polymer-element>
这归结为时间问题。 wc-split-rule
事件在您的 wc-split
元素注册之前触发。因此,该事件被错过了。这只是元素首次启动时的问题 b/c 你有一个父元素,它也是一个自定义元素。解决此问题的一种方法是确保在附加 wc-split-rule
后触发事件:
attached: function() {
this._changed();
},
我在 Polymer 1.0 中遇到与 Web 组件嵌套结构内的事件传播相关的问题。特别是,我试图通过位于其本地 DOM 中的名为 wc-split-rule
的其他组件的集合来动态配置名为 wc-split
的 Web 组件。以下代码片段显示了正确的使用形式:
<wc-split-test>
<wc-split>
<wc-split-rule key="{{k1}}" ...></wc-split-rule>
<wc-split-rule key="{{k2}}" ...></wc-split-rule>
<wc-split-rule key="{{k3}}" ...></wc-split-rule>
</wc-split>
</wc-split-test>
如前例所示,目的是向 wc-split
组件提供每个 wc-split-rule
组件中 key
属性的值。由于我们需要动态重新配置功能,架构策略首先在每次满足 key
属性的更改时触发一个事件,然后通过冒泡到达 wc-split
组件来促进这些更改,该组件会处理它们。
以下方法在 [1] 在具有文字值的纯 HTML 上下文中和 [2] 在具有数据绑定值的组件模板中进行测试时可以正常工作。然而,[3] 当它在组件模板中使用文字值进行测试时,不会促进更改。似乎忽略了事件传播或 wc-split
中定义的侦听器未捕获事件:
<wc-split-test>
<wc-split> <!-- does not work -->
<wc-split-rule key="k1" ...></wc-split-rule>
<wc-split-rule key="k2" ...></wc-split-rule>
<wc-split-rule key="k3" ...></wc-split-rule>
</wc-split>
</wc-split-test>
以下清单显示了两个组件的实现 [https://goo.gl/OkU9jQ]:
<dom-module id="wc-split-rule">
<script>
Polymer({
is: 'wc-split-rule',
properties: {
key : {
type: String,
reflectToAttribute: true,
notify: true,
value: '',
observer: '_changed'
},
},
_changed: function (){
this.fire('wc-split-rule', {
key : this.key,
});
}
});
</script>
</dom-module>
<dom-module id="wc-split">
<template>
<content></content>
</template>
<script>
Polymer( {
is: 'wc-split',
listeners: {
'wc-split-rule': 'onRule'
},
ready: function(){
...
},
onRule: function (event, context){
... // this is executed in test [1] and [2] NOT in [3]
}
});
</script>
</dom-module>
<dom-module id="wc-split-test">
<template>
<wc-split id="split">
<wc-split-rule key="e1"/>
</wc-split>
</template>
<script>
...
</script>
</dom-module>
令人惊讶的是,Polymer 0.5 上的相同代码对于每个测试场景都能正常工作 [https://goo.gl/CHV3JE]:
<polymer-element name="wc-split-rule">
<script>
Polymer('wc-split-rule', {
publish : {
key : '',
},
observe: {
key : '_changed',
},
_changed: function (){
this.fire('wc-split-rule', {
key : this.key,
});
}
});
</script>
</polymer-element>
<polymer-element name="wc-split">
<template>
<div on-wc-split-rule="{{onRule}}">
<content select="wc-split-rule"></content>
</div>
<content></content>
</template>
<script>
Polymer('wc-split', {
ready: function(){
...
},
onRule: function (event, context){
... // this is always executed
}
});
</script>
</polymer-element>
<polymer-element name="wc-split-test">
<template>
<wc-split id="split">
<wc-split-rule key="e1"/>
</wc-split>
</template>
<script>
...
</script>
</polymer-element>
这归结为时间问题。 wc-split-rule
事件在您的 wc-split
元素注册之前触发。因此,该事件被错过了。这只是元素首次启动时的问题 b/c 你有一个父元素,它也是一个自定义元素。解决此问题的一种方法是确保在附加 wc-split-rule
后触发事件:
attached: function() {
this._changed();
},