Polymer 1.x:数据绑定到子属性
Polymer 1.x: Databinding to sub-properties
我想将数据绑定到对象的子属性。
我希望看到我的输出随着 select 不同菜单项的变化而变化。但是,我在输出中没有看到任何响应。
要重现问题,请按照以下步骤操作。
- Open this jsBin.
- 注意两个输出(Dom-repeat 和 Computed)正确反映了 selected 菜单项"bar" 和 "qux".
- Select(或取消select)一个菜单项。
- 通知 Dom-重复 适当响应。
- ❌ 注意 Computed 根本没有响应。
什么代码使Computed响应子属性的变化ob.selected
?
http://jsbin.com/piheyivofu/edit?html,输出
<!doctype html>
<head>
<meta charset="utf-8">
<base href="https://polygit.org/components/">
<script src="webcomponentsjs/webcomponents-lite.min.js"></script>
<link href="paper-menu/paper-menu.html" rel="import">
<link href="paper-item/paper-item.html" rel="import">
</head>
<body>
<x-element></x-element>
<dom-module id="x-element">
<template>
<style>
iron-selector > * {
padding: 8px;
}
.iron-selected {
background-color: blue;
color: white;
}
</style>
<br><br>
<paper-menu multi attr-for-selected="name" selected-values="{{ob.selected}}">
<paper-item name="foo" >Foo</paper-item>
<paper-item name="bar" >Bar</paper-item>
<paper-item name="baz" >Baz</paper-item>
<paper-item name="qux" >Qux</paper-item>
<paper-item name="quux">Quux</paper-item>
</paper-menu>
<p>
<strong>Dom-repeat</strong>:
<template is="dom-repeat" items="{{ob.selected}}">
<span>[[item]] </span>
</template>
</p>
<p><strong>Computed</strong>: {{str}}</p>
</template>
<script>
Polymer({
is: 'x-element',
properties: {
ob: {
type: Object,
value: function() {
return {
selected: ['bar', 'qux'],
}
}
},
str: {
type: String,
computed: '_computeStr(ob)',
}
},
_computeStr: function(temp) { // Doesn't respond to changes in temp.selected
return temp.selected.join(', ');
},
});
</script>
</dom-module>
</body>
了解 对象身份 很重要。今天,Polymer 将对象的值视为它的身份。如果 x == 2,而我设置 x=4,则 x 的值已更改。如果 ob = {foo:3},并且我设置 ob.foo = 4,ob 有 not 改变值(它的身份没有改变)并且这个改变不会触发对 ob
的观察。
相反,我们可以直接观察 ob.foo
,或者通过 ob.*
观察 ob 的所有子属性,或者,如果它是一个数组,则观察 ob 的长度 (ob.length
)。
这样的事情会起作用,例如:
str: {
type: String,
computed: '_computeStr(ob, ob.*)',
}
},
_computeStr: function(temp, info) {
return temp.selected.join(', ');
},
这是有效的,因为我已经要求在 ob 的 子属性发生变化时得到通知...这是 ob.*
返回的 info
对 ob.*
的观察包含关于 ob
.
发生的事情的信息
我想将数据绑定到对象的子属性。
我希望看到我的输出随着 select 不同菜单项的变化而变化。但是,我在输出中没有看到任何响应。
要重现问题,请按照以下步骤操作。
- Open this jsBin.
- 注意两个输出(Dom-repeat 和 Computed)正确反映了 selected 菜单项"bar" 和 "qux".
- Select(或取消select)一个菜单项。
- 通知 Dom-重复 适当响应。
- ❌ 注意 Computed 根本没有响应。
什么代码使Computed响应子属性的变化ob.selected
?
<!doctype html>
<head>
<meta charset="utf-8">
<base href="https://polygit.org/components/">
<script src="webcomponentsjs/webcomponents-lite.min.js"></script>
<link href="paper-menu/paper-menu.html" rel="import">
<link href="paper-item/paper-item.html" rel="import">
</head>
<body>
<x-element></x-element>
<dom-module id="x-element">
<template>
<style>
iron-selector > * {
padding: 8px;
}
.iron-selected {
background-color: blue;
color: white;
}
</style>
<br><br>
<paper-menu multi attr-for-selected="name" selected-values="{{ob.selected}}">
<paper-item name="foo" >Foo</paper-item>
<paper-item name="bar" >Bar</paper-item>
<paper-item name="baz" >Baz</paper-item>
<paper-item name="qux" >Qux</paper-item>
<paper-item name="quux">Quux</paper-item>
</paper-menu>
<p>
<strong>Dom-repeat</strong>:
<template is="dom-repeat" items="{{ob.selected}}">
<span>[[item]] </span>
</template>
</p>
<p><strong>Computed</strong>: {{str}}</p>
</template>
<script>
Polymer({
is: 'x-element',
properties: {
ob: {
type: Object,
value: function() {
return {
selected: ['bar', 'qux'],
}
}
},
str: {
type: String,
computed: '_computeStr(ob)',
}
},
_computeStr: function(temp) { // Doesn't respond to changes in temp.selected
return temp.selected.join(', ');
},
});
</script>
</dom-module>
</body>
了解 对象身份 很重要。今天,Polymer 将对象的值视为它的身份。如果 x == 2,而我设置 x=4,则 x 的值已更改。如果 ob = {foo:3},并且我设置 ob.foo = 4,ob 有 not 改变值(它的身份没有改变)并且这个改变不会触发对 ob
的观察。
相反,我们可以直接观察 ob.foo
,或者通过 ob.*
观察 ob 的所有子属性,或者,如果它是一个数组,则观察 ob 的长度 (ob.length
)。
这样的事情会起作用,例如:
str: {
type: String,
computed: '_computeStr(ob, ob.*)',
}
},
_computeStr: function(temp, info) {
return temp.selected.join(', ');
},
这是有效的,因为我已经要求在 ob 的 子属性发生变化时得到通知...这是 ob.*
返回的 info
对 ob.*
的观察包含关于 ob
.