[英]How to set property value in Polymer 2.x?
我在Polymer 2.x中遇到了一个简单的问题。 我不知道如何从另一个元素类正确设置自定义元素属性的值。
我的代码:
<dom-module id="cookbook-wall">
<template>
<style>
// my styling
</style>
<div class="wall">
<template is="dom-repeat" items="[[_getRecipesList()]]">
<cookbook-recipe-card name="recipe-card"></cookbook-recipe-card>
</template>
</div>
</template>
<script>
class CookbookWall extends Polymer.Element {
static get is() {
return 'cookbook-wall';
}
static get properties() {
// this property is unused now, I tried to set it dynamically from
// method below but it also failed
return {
recipes: Array
}
}
_getRecipesList() {
var test = new CookbookRecipeCard();
test.setData("This is test title", "This is test content");
return [test, test, test];
}
}
window.customElements.define(CookbookWall.is, CookbookWall);
</script>
和
<dom-module id="cookbook-recipe-card">
<template>
<style include="shared-styles">
// my styling
</style>
<div class="card">
<div id="titleContent">{{title}}</div>
<div class="my-block">
<div class="contentCaption">Treść przepisu:</div>
<div class="content">{{content}}</div>
</div>
</div>
</template>
<script>
class CookbookRecipeCard extends Polymer.Element {
static get is() {
return 'cookbook-recipe-card';
}
static get properties() {
return {
myName: String,
myContent: String
}
}
setData(myTitle, myContent) {
this.myTitle = myTitle;
this.myContent = myContent;
}
}
window.customElements.define(CookbookRecipeCard.is, CookbookRecipeCard);
</script>
如您所见,我想从另一个元素类中执行以下操作: setData(myTitle, myContent)
,但它不起作用。 有什么方法可以实现与Polymer中面向对象语言中的传统setter相似的结果?
谢谢你的帮助!
编辑(我的解决方案):
我删除了自定义卡组件,只使用了普通纸卡:
<dom-module id="cookbook-wall">
<template>
<style>...</style>
<div class="wall">
<template id="cardSet" is="dom-repeat" items="[[_getArray()]]" as="card">
<paper-card id="myCard">
<div class="card">
<div id="titleContent">[[card.title]]</div>
<div class="my-block">
<div class="contentCaption">Treść przepisu:</div>
<div class="content">[[card.text]]</div>
</div>
</div>
</paper-card>
</template>
</div>
</template>
<script>
class CookbookWall extends Polymer.Element {
static get is() {
return 'cookbook-wall';
}
_getArray() {
// example usage
return [{'title': 'Title 1', 'text': 'Description 1'},
{'title': 'Title 2', 'text': 'Description 2'},
{'title': 'Title 3', 'text': 'Description 3'}];
}
}
window.customElements.define(CookbookWall.is, CookbookWall);
</script>
这些只是常规的JavaScript / DOM属性,因此可以在js中使用elements.recipeList = [item, item, item];
设置它们elements.recipeList = [item, item, item];
然后在您的模板中,dom中继器可能看起来像
<template is="dom-repeat" items="[[recipeList]]">
<cookbook-recipe-card name="recipe-card" recipe="[[item]]"></cookbook-recipe-card>
</template>
请注意,在此示例中,我是如何通过食谱属性将商品作为食谱属性传递给卡片的。
您还可以通过在主机元素中定义它来计算配方清单属性
static get properties() {
return {
recipeList: {
type: Array,
computed: "_getRecipeList(dependencies)"
}
}
计算属性的优点是可以从元素外部读取它们。
这是一个可能更好的设计。 它允许用户cookbook-wall
设置cards
,同时供给的缺省值cards
。
<dom-module id="cookbook-wall">
<template>
<style>...</style>
<div class="wall">
<template id="cardSet" is="dom-repeat" items="[[cards]]" as="card">
<paper-card id="myCard">
<div class="card">
<div id="titleContent">[[card.title]]</div>
<div class="my-block">
<div class="contentCaption">Treść przepisu:</div>
<div class="content">[[card.text]]</div>
</div>
</div>
</paper-card>
</template>
</div>
</template>
<script>
class CookbookWall extends Polymer.Element {
static get is() {
return 'cookbook-wall';
}
static get properties() {
return {
cards: {
type: Array,
value: () => {
return [
{'title': 'Title 1', 'text': 'Description 1'},
{'title': 'Title 2', 'text': 'Description 2'},
{'title': 'Title 3', 'text': 'Description 3'}];
}
};
}
}
window.customElements.define(CookbookWall.is, CookbookWall);
</script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.