点击聚合物铁列表项目的侦听器?
Tap listener for polymer iron-list item?
我有一个自定义元素,它利用 iron-list
来显示对象数组。每个项目都是通过模板生成的,如下所示:
<iron-list id="projectList" items="[[projects]]" indexAs="_id" as="projLI" class="layout flex">
<template>
<div>
<paper-material id="itemShadow" animated elevation="1">
<div class="item layout horizontal" onmouseover="hoverOver(this)" onmouseout="hoverOut(this)">
<!-- I use a paper-menu-button to display a list of available actions here -->
<!-- list item object content here such as: [[projLI.desc]] etc. -->
</div>
</paper-material>
</div>
</template>
</iron-list>
什么是最好的聚合物友好方法来检测 iron-list 项目本身的点击事件(理想情况下知道通过 projLI._id
实际点击了哪个项目),同时还能够处理内部paper-menu-button
以不同的方式点击事件?
我关注了 Polymer 1.0 的新事件侦听器 (https://www.polymer-project.org/1.0/docs/devguide/events.html),作为一种可能的方法,尝试侦听不同的元素点击事件(如该页面上的示例 1 所示),但我不确定这是否适用于此。我还考虑过可能在 iron-list 周围使用 iron-selector
吗?那可行吗?我不确定这是否可行,因为 iron-selector 只会有一个子元素(即 iron-list 元素而不是它的模板子元素)。
我觉得我错过了一个非常简单的方法来完成这个。有人可以给我看灯吗?
我通过在列表元素 id 中编码数组索引,然后将该 id 从列表项事件目标中拉出来实现。这是执行此操作的示例 Polymer 元素。
<link rel="import" href="../../bower_components/polymer/polymer.html">
<link rel="import" href="../../bower_components/iron-list/iron-list.html">
<dom-module id="list-example">
<style>
:host {
display: block;
}
#list-example {
height: 100px;
}
</style>
<template>
<paper-material animated elevation="1">
<iron-list id="list-example" items="[[data]]">
<template>
<div id="{{index2id(item.index)}}" on-mouseover="onMouseOverItem">{{item.name}}</div>
</template>
</iron-list>
</paper-material>
</template>
</dom-module>
<script>
(function () {
Polymer({
is: 'list-example',
ready: function() {
for(var i = 0; i < this.data.length; i++) {
this.data[i].index = i;
}
},
index2id: function(index) {
return "_" + index;
},
id2index: function(id) {
return Number(id.substr(1));
},
onMouseOverItem: function(e) {
console.log('on-mouseover list item:', this.data[this.id2index(e.target.getAttribute('id'))]);
},
properties: {
data: {
type: Array,
value: [{name: 'A'}, {name: 'B'}, {name: 'C'},
{name: 'D'}, {name: 'E'}, {name: 'F'},
{name: 'G'}, {name: 'H'}, {name: 'I'}]
}
}
});
})();
</script>
我刚刚解决了这里的问题https://groups.google.com/forum/#!topic/polymer-dev/r9IsUKVnLVM. Reading this documentation https://www.polymer-project.org/1.0/docs/devguide/events.html。
希望对你有帮助!
用 iron-selector
包裹您的 iron-list
- 这样您就可以选择/点击行。
(注意:您可能需要删除自定义 indexAs="_id" 属性以获得正确的行索引)
<iron-selector attr-for-selected="index" on-tap="_itemSelected">
<iron-list id="projectList" items="[[projects]]" as="projLI" class="fit">
<template>
<div class="layout horizontal center" id="{{index}}">
<!-- your row content here -->
</div>
</template>
</iron-list>
</iron-selector>
所选行项目的聚合物方法:
_itemSelected: function (e) {
console.log(e.target.id); // selected iron-list row index
}
我遇到了类似的问题并使用 <array-selector>
解决了我的问题,如下所示:
<iron-list items="{{myarray}}" as="ref">
<template>
<div>
<paper-checkbox on-tap="toggleSelection"></paper-checkbox>
<span>{{ref.name}}</span>
</div>
</template>
</iron-list>
<array-selector id="arrsel" items="{{myarray}}"
selected="{{selectedName}}" toggle></array-selector>
和myarray
是一个对象数组:
var myarray = [{name: "Alice"}, {name: "Ben"}, ...]
函数toggleSelection
定义如下:
toggleSelection: function(e) {
console.log ("Selected index is " + e.model.index);
console.log ("Selected name is " + e.model.ref);
this.$.arrsel.select (e.model.ref);
console.log ("Current selection: ", this.selectedName);
}
e.model.__
后的字段名ref是iron-list
的as
属性的值。
警告:变量 e.model
未正式记录在 Polymer 1.0 iron-list
文档 (https://elements.polymer-project.org/elements/iron-list) 中,但我发现了它在我的调试会话期间。我假设 e.model
是 public 属性 (Polymer 的编码风格使用下划线前缀 private 属性 例如:_scroll_Position
) 并且它不是弃用的候选对象。
Follow the model outlined on lines 154 and 184 of this demo。
https://github.com/PolymerElements/iron-list/blob/master/demo/collapse.html
my-element.html
<iron-list items="[[items]]">
<template>
<my-list-item on-tap="_toggleMe"></my-list-item>
</template>
</iron-list>
...
_toggleMe: function(e) {
console.log(e.model.index);
}
关键是将事件和侦听器方法(在本例中为toggleMe()
)放在iron-list
的<template>
中。这允许 iron-list
注册数组索引。
我有一个自定义元素,它利用 iron-list
来显示对象数组。每个项目都是通过模板生成的,如下所示:
<iron-list id="projectList" items="[[projects]]" indexAs="_id" as="projLI" class="layout flex">
<template>
<div>
<paper-material id="itemShadow" animated elevation="1">
<div class="item layout horizontal" onmouseover="hoverOver(this)" onmouseout="hoverOut(this)">
<!-- I use a paper-menu-button to display a list of available actions here -->
<!-- list item object content here such as: [[projLI.desc]] etc. -->
</div>
</paper-material>
</div>
</template>
</iron-list>
什么是最好的聚合物友好方法来检测 iron-list 项目本身的点击事件(理想情况下知道通过 projLI._id
实际点击了哪个项目),同时还能够处理内部paper-menu-button
以不同的方式点击事件?
我关注了 Polymer 1.0 的新事件侦听器 (https://www.polymer-project.org/1.0/docs/devguide/events.html),作为一种可能的方法,尝试侦听不同的元素点击事件(如该页面上的示例 1 所示),但我不确定这是否适用于此。我还考虑过可能在 iron-list 周围使用 iron-selector
吗?那可行吗?我不确定这是否可行,因为 iron-selector 只会有一个子元素(即 iron-list 元素而不是它的模板子元素)。
我觉得我错过了一个非常简单的方法来完成这个。有人可以给我看灯吗?
我通过在列表元素 id 中编码数组索引,然后将该 id 从列表项事件目标中拉出来实现。这是执行此操作的示例 Polymer 元素。
<link rel="import" href="../../bower_components/polymer/polymer.html">
<link rel="import" href="../../bower_components/iron-list/iron-list.html">
<dom-module id="list-example">
<style>
:host {
display: block;
}
#list-example {
height: 100px;
}
</style>
<template>
<paper-material animated elevation="1">
<iron-list id="list-example" items="[[data]]">
<template>
<div id="{{index2id(item.index)}}" on-mouseover="onMouseOverItem">{{item.name}}</div>
</template>
</iron-list>
</paper-material>
</template>
</dom-module>
<script>
(function () {
Polymer({
is: 'list-example',
ready: function() {
for(var i = 0; i < this.data.length; i++) {
this.data[i].index = i;
}
},
index2id: function(index) {
return "_" + index;
},
id2index: function(id) {
return Number(id.substr(1));
},
onMouseOverItem: function(e) {
console.log('on-mouseover list item:', this.data[this.id2index(e.target.getAttribute('id'))]);
},
properties: {
data: {
type: Array,
value: [{name: 'A'}, {name: 'B'}, {name: 'C'},
{name: 'D'}, {name: 'E'}, {name: 'F'},
{name: 'G'}, {name: 'H'}, {name: 'I'}]
}
}
});
})();
</script>
我刚刚解决了这里的问题https://groups.google.com/forum/#!topic/polymer-dev/r9IsUKVnLVM. Reading this documentation https://www.polymer-project.org/1.0/docs/devguide/events.html。
希望对你有帮助!
用 iron-selector
包裹您的 iron-list
- 这样您就可以选择/点击行。
(注意:您可能需要删除自定义 indexAs="_id" 属性以获得正确的行索引)
<iron-selector attr-for-selected="index" on-tap="_itemSelected">
<iron-list id="projectList" items="[[projects]]" as="projLI" class="fit">
<template>
<div class="layout horizontal center" id="{{index}}">
<!-- your row content here -->
</div>
</template>
</iron-list>
</iron-selector>
所选行项目的聚合物方法:
_itemSelected: function (e) {
console.log(e.target.id); // selected iron-list row index
}
我遇到了类似的问题并使用 <array-selector>
解决了我的问题,如下所示:
<iron-list items="{{myarray}}" as="ref">
<template>
<div>
<paper-checkbox on-tap="toggleSelection"></paper-checkbox>
<span>{{ref.name}}</span>
</div>
</template>
</iron-list>
<array-selector id="arrsel" items="{{myarray}}"
selected="{{selectedName}}" toggle></array-selector>
和myarray
是一个对象数组:
var myarray = [{name: "Alice"}, {name: "Ben"}, ...]
函数toggleSelection
定义如下:
toggleSelection: function(e) {
console.log ("Selected index is " + e.model.index);
console.log ("Selected name is " + e.model.ref);
this.$.arrsel.select (e.model.ref);
console.log ("Current selection: ", this.selectedName);
}
e.model.__
后的字段名ref是iron-list
的as
属性的值。
警告:变量 e.model
未正式记录在 Polymer 1.0 iron-list
文档 (https://elements.polymer-project.org/elements/iron-list) 中,但我发现了它在我的调试会话期间。我假设 e.model
是 public 属性 (Polymer 的编码风格使用下划线前缀 private 属性 例如:_scroll_Position
) 并且它不是弃用的候选对象。
Follow the model outlined on lines 154 and 184 of this demo。 https://github.com/PolymerElements/iron-list/blob/master/demo/collapse.html
my-element.html<iron-list items="[[items]]">
<template>
<my-list-item on-tap="_toggleMe"></my-list-item>
</template>
</iron-list>
...
_toggleMe: function(e) {
console.log(e.model.index);
}
关键是将事件和侦听器方法(在本例中为toggleMe()
)放在iron-list
的<template>
中。这允许 iron-list
注册数组索引。