我有一个父组件,在"铁页"中有两个子组件。零件。父母应该在收到来自其中一个孩子的事件时切换页面。问题是,当事件到达父组件时,它会执行代码来切换子组件,但没有任何反应。但是,如果代码在父组件本身上执行,那么它就可以工作。
我的问题是:为什么父组件在孩子发送事件时无法切换页面?
以下是两个子组件的代码:
// this is "child-comm.html"
<link rel="import"
href="bower_components/polymer/polymer.html">
<dom-module id="child-comm">
<style>
div {
width: 300px;
height: 300px;
background-color: #CCC;
}
</style>
<template>
<div>I'm child 0!</div>
</template>
</dom-module>
<script>
Polymer({
is: "child-comm",
listeners: {
'tap': 'doTap'
},
doTap: function() {
this.fire("taped-child")
}
});
</script>
和另一个孩子:
this is "child-comm2.html"
<link rel="import"
href="bower_components/polymer/polymer.html">
<dom-module id="child-comm2">
<style>
div {
width: 300px;
height: 300px;
background-color: #C00;
}
</style>
<template>
<div>I'm child 2!</div>
</template>
</dom-module>
<script>
Polymer({
is: "child-comm2",
listeners: {
'tap': 'doTap'
},
doTap: function() {
this.fire("taped-child")
}
});
</script>
然后我们有了父组件:
<link rel="import"
href="bower_components/polymer/polymer.html">
<link rel="import"
href="child-comm.html">
<link rel="import"
href="child-comm2.html">
<link rel="import"
href="bower_components/iron-pages/iron-pages.html">
<dom-module is="parent-comm">
<template>
<iron-pages selected="0">
<child-comm on-taped-child="switchPages"></child-comm>
<child-comm2 on-taped-child="switchPages"></child-comm2>
</iron-pages>
</template>
</dom-module>
<script>
Polymer({
is: "parent-comm",
switchPages: function(e) {
this.pages.selectNext(); // this will not work if the event is created in a child component
console.log(this.pages); // this will print the correct node on console even when being fired by a child custom event
},
ready: function() {
this.pages = document.querySelector('iron-pages');
this.switchPages(); // this will switch pages correctly
console.log(this.pages);
}
});
</script>
谢谢...
答案 0 :(得分:2)
解决这个特殊问题的一个快速入侵就是拦截父节点上的子事件,但是不要让它调用方法来切换页面,而是调用方法异步。以下是父节点的工作代码:
<dom-module is="parent-comm">
<template>
<iron-pages selected="0">
<child-comm on-taped-child="asyncSwitchPages"></child-comm>
<child-comm2 on-taped-child="asyncSwitchPages"></child-comm2>
</iron-pages>
</template>
</dom-module>
<script>
Polymer({
is: "parent-comm",
switchPages: function() {
this.pages.selectNext();
},
asyncSwitchPages: function(e) {
this.async(this.switchPages);
},
ready: function() {
this.pages = document.querySelector('iron-pages');
}
});
</script>
注意:我很想听到“为什么”我必须这样做,所以我只是不接受这个答案。
答案 1 :(得分:0)
我认为你需要监听自定义事件。尝试将以下内容添加到父级的就绪功能中。
this.addEventListener('taped-child', function(e) {
this.switchPages();
});