聚合物1.0事件在嵌套组件中触发

时间:2015-08-19 08:33:47

标签: events polymer listener polymer-1.0

我在Polymer 1.0中遇到与Web组件的嵌套结构中的事件传播相关的问题。特别是,我试图通过位于其本地DOM中的名为wc-split的其他组件的集合来动态配置名为wc-split-rule的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组件提供每个key组件中wc-split-rule个属性的值。由于我们需要动态重新配置功能,因此架构策略首先在每次满足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>       

1 个答案:

答案 0 :(得分:1)

这归结为时间问题。在wc-split-rule元素注册之前,wc-split事件已触发。因此,该事件正在被遗漏。首次启动元素时,这只是一个问题b / c你有一个父元素,它也是一个自定义元素。解决此问题的一种方法是确保在附加wc-split-rule后事件触发:

attached: function() {
  this._changed();
},

这有效:http://jsbin.com/yixinuhahu/edit?html,output