我有一个电子邮件组件(email-tag.html),它由标签,选择和删除按钮元素组成。
email-tag.html组件托管在其父级email-view-tag.html中。 email-view-tag包含一个add-email-button按钮,每次点击它时都会将email-tag元素添加到DOM中。
单击“删除”按钮时,我需要帮助删除添加的电子邮件标记组件。它是包含应删除的删除按钮的compnoent。
这两个组成部分如下所示:
电子邮件tag.html
<!DOCTYPE html>
<polymer-element name='email-tag'>
<template>
<style>
.main-flex-container
{
display:flex;
flex-flow:row wrap;
align-content:flex-start;
}
.col
{
display:flex;
flex-flow:column;
align-content:flex-start;
flex-grow:1;
}
</style>
<div id='email' class='main-flex-container'>
<section id='col1' class='col'>
<input id=emailTxt
type='text'
list='_emails'
value='{{webContact.homeEmail}}'>
<datalist id='_emails'>
<template repeat='{{email in emails}}'>
<option value='{{email}}'>{{email}}</option>
</template>
</datalist>
</section>
<section id='col2' class='col'>
<button id='delete-email-btn' type='button' on-click='{{deletePhone}}'>Delete</button>
</section>
</div>
</template>
<script type="application/dart">
import 'package:polymer/polymer.dart' show CustomTag, PolymerElement;
import 'dart:html' show Event, Node;
@CustomTag( 'email-tag' )
class EmailElement extends PolymerElement
{
//@observable
EmailElement.created() : super.created();
List<String> emails = [ '', 'Home', 'Personal', 'Private', 'Work', ];
void deletePhone( Event e, var detail, Node target)
{
//shadowRoot.querySelector('#new-phone' ).remove();
//print( 'Current row deleted' );
}
}
</script>
</polymer-element>
电子邮件 - 视图 - tag.html
<!DOCTYPE html>
<link rel="import" href="email-tag.html">
<polymer-element name='email-view-tag'>
<template>
<style>
.main-flex-container
{
display:flex;
flex-flow:row wrap;
align-content:flex-start;
}
.col
{
display:flex;
flex-flow:column;
align-content:flex-start;
flex-grow:1;
}
</style>
<div id='email-view' class='main-flex-container'>
<section id='row0' >
<button id='add-email-btn' type='button' on-click='{{addPhone}}'>Add Phone</button>
</section >
<section id='rows' class='col'>
<!-- <epimss-phone-header-tag id='col1' class='col'></epimss-phone-header-tag> -->
</section>
</div>
</template>
<script type="application/dart">
import 'package:polymer/polymer.dart' show CustomTag, PolymerElement;
import 'dart:html' show Event, Node, Element;
@CustomTag( 'email-view-tag' )
class EmailViewElement extends PolymerElement
{
//@observable
EmailViewElement.created() : super.created();
void addPhone( Event e, var detail, Node target )
{
$[ 'rows' ].children.add( new Element.tag( 'email-tag' ) );
}
@override
void attached() {
super.attached();
$[ 'add-email-btn' ].click();
}
}
</script>
</polymer-element>
应用程序确实正常执行,单击“添加”按钮会添加电子邮件组件。删除按钮不起作用 - 我在这里寻求帮助。
由于
答案 0 :(得分:1)
子组件<email-tag>
不应该自行删除。相反,它应该通过调度自定义事件将该职责委托给父组件email-view-tag
。
以下是从deletePhone
调度自定义事件的代码:
void deletePhone( Event e, var detail, Node target){
dispatchEvent(new CustomEvent('notneeded'));
}
然后,在父级<custom-view>
中,更改代码以添加<email-tag>
,如下所示:
void addPhone( Event e, var detail, Node target ) {
$['rows'].children.add( new Element.tag('email-tag'));
$['rows'].on["notneeded"].listen((Event e) {
(e.target as Element).remove();
});
}
另外,我会更改deletePhone
的名称,因为该方法不再删除记录,而只是通知父级不需要它。称之为'notNeeded'或类似的东西。
答案 1 :(得分:0)
修改强> @ShailenTuli对于封装不应该被打破是正确的。
但JS Polymer元素也会在其布局元素中访问父元素,因为在某些情况下它仍然很方便。
现在也可以在PolymerDart中使用。
(this.parentNode as ShadowRoot).host
<强> ORIGINAL 强>
您可以触发事件并使email-view-tag听取此标记,事件处理程序可以从其子项中删除事件目标。
我刚才有类似的问题: How to access parent model from polymer component
这实际上是我想要参考的问题
How can I access the host of a custom element
但第一个也可能有用。
PolymerJS FAQ - When is the best time to access an element’s parent node?
attached()
目前仍在Dart中命名为 enteredView()
,但很快就会重命名。