我想数据绑定到对象的子属性。
我希望看到我的输出更改以响应选择不同的菜单项。但相反,我在输出中看不到任何反应。
要重新创建问题,请按以下步骤操作。
什么代码使 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>
答案 0 :(得分:4)
了解对象标识非常重要。今天,Polymer认为Object的价值是它的身份。如果x == 2,并且我设置x = 4,则x已更改值。如果ob = {foo:3},并且我设置了ob.foo = 4,则ob 不更改了值(它的身份未被更改)并且此更改将不会触发对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
发生了什么的信息。