聚合物数据绑定未在阵列突变时更新
Polymer data-binding not updated on array mutation
我注意到 Polymer 中的 template/data-binding 似乎没有反映数组 属性 何时发生突变(即 push()
)。示例代码如下:
<body>
<dom-module id="my-element">
<template>
<pre>
[my-element]
myArray: [[jsonStringify(myArray)]]
</pre>
</template>
</dom-module>
<my-element id="elm"></my-element>
<button onclick="pushArray()">pushArray</button>
<button onclick="setArray()">setArray</button>
<script>
(function registerElements() {
Polymer({
is: 'my-element',
properties: {
myArray: {
type: Array,
value: function () {
return [];
}
}
},
pushArray: function(value) {
this.push('myArray', {id: value});
},
setArray: function(value) {
this.set('myArray', [{id: value}]);
},
jsonStringify: function(obj) {
return JSON.stringify(obj);
}
});
})();
function pushArray () {
var elm = document.querySelector('#elm');
elm.pushArray('Push');
}
function setArray () {
var elm = document.querySelector('#elm');
elm.setArray('Set');
}
</script>
</body>
每当我单击 pushArray
按钮时,一个项目 "Push" 应该添加到 myArray
,但它没有反映在模板 [[jsonStringify(myArray)]]
中。这是预期的行为吗?无论如何要解决这个问题?
Array change observer有点棘手。在您的代码中,通过使用 myArray
,您隐式观察(仅)对(整个)数组的引用,该引用仅在您 运行 setArray
.
时发生变化
为了克服这个问题,你还必须使用深度观察者,即myArray.*
。因此,dom-module
的正确代码如下:
<dom-module id="my-element">
<template>
<pre>
[my-element]
myArray: [[jsonStringify(myArray, myArray.*)]]
</pre>
</template>
</dom-module>
现场演示:http://jsbin.com/yulivuwufu/1/edit?html,css,output
无需更改其他代码。
我注意到 Polymer 中的 template/data-binding 似乎没有反映数组 属性 何时发生突变(即 push()
)。示例代码如下:
<body>
<dom-module id="my-element">
<template>
<pre>
[my-element]
myArray: [[jsonStringify(myArray)]]
</pre>
</template>
</dom-module>
<my-element id="elm"></my-element>
<button onclick="pushArray()">pushArray</button>
<button onclick="setArray()">setArray</button>
<script>
(function registerElements() {
Polymer({
is: 'my-element',
properties: {
myArray: {
type: Array,
value: function () {
return [];
}
}
},
pushArray: function(value) {
this.push('myArray', {id: value});
},
setArray: function(value) {
this.set('myArray', [{id: value}]);
},
jsonStringify: function(obj) {
return JSON.stringify(obj);
}
});
})();
function pushArray () {
var elm = document.querySelector('#elm');
elm.pushArray('Push');
}
function setArray () {
var elm = document.querySelector('#elm');
elm.setArray('Set');
}
</script>
</body>
每当我单击 pushArray
按钮时,一个项目 "Push" 应该添加到 myArray
,但它没有反映在模板 [[jsonStringify(myArray)]]
中。这是预期的行为吗?无论如何要解决这个问题?
Array change observer有点棘手。在您的代码中,通过使用 myArray
,您隐式观察(仅)对(整个)数组的引用,该引用仅在您 运行 setArray
.
为了克服这个问题,你还必须使用深度观察者,即myArray.*
。因此,dom-module
的正确代码如下:
<dom-module id="my-element">
<template>
<pre>
[my-element]
myArray: [[jsonStringify(myArray, myArray.*)]]
</pre>
</template>
</dom-module>
现场演示:http://jsbin.com/yulivuwufu/1/edit?html,css,output
无需更改其他代码。