我們正在構建聚合物應用程序。 我們有一個元素陣列,它們在使用dom-repeat的組件中顯示。下面是一個例子片段:dom-repeat中的項目變更未通知其他項目
//main component
<h2>List of elements</h2>
<template is="dom-repeat" items="{{elements}}" as="item" indexAs="index">
<another-component element="{{item}}" ident$="{{index}}"></another-component>
</template>
和
//sub component
<h3>{{element.name}}</h3>
<h4>{{element.person.name}}</h4>
<paper-button on-tap="_changeName">Change name!</paper-button>
陣列的對象具有一些共同的引用。你可以看到他們是這樣的:
//main component
<script>
var fred = {"name": "fred"};
var tom = {"name": "tom"};
Polymer({
is: 'example-component',
properties: {
elements: {
type: Array,
value: [{"name": "Main1", "person": fred}, {"name": "Main2", "person": tom}, {"name": "Main3", "person": fred}],
notify: true
}
}
});
</script>
現在,在我的項目中,我希望能夠改變一個嵌套元素。
在這個例子中,我想要項目3的人員值改變。
但是因爲第3項的人蔘考與第1項相同,所以我也希望第1項改變。
但是,我的經驗是,項目1沒有更新。
There is a complete example setup at this address.(我可以讓jsfiddle正確使用我的依賴關係...)。
到目前爲止,我已經嘗試過尋找到
- 聽衆
- notifyPath
- 觀察家
沒有成功。 我也想避免將我的整個數組傳遞給我的項目。
我知道使用像Redux這樣的狀態對象很容易解決這個問題,所以不幸的是這不能成爲解決方案。
我已經在互聯網上找到了很多關於如何讓數據向下冒泡的資源,但不是像我現在要做的那樣冒泡。
任何幫助,將不勝感激。
供參考的完整代碼:
主要成分
<link rel="import" href="/polymer/polymer.html">
<link rel="import" href="/components/another-component/another-component.html">
<dom-module id="example-component">
<template>
<style>
:host {
display: block;
}
</style>
<h1>Example</h1>
<h2>List of elements</h2>
<template is="dom-repeat" items="{{elements}}" as="item" indexAs="index">
<another-component element="{{item}}" ident$="{{index}}"></another-component>
</template>
</template>
<script>
var fred = {"name": "fred"};
var tom = {"name": "tom"};
Polymer({
is: 'example-component',
properties: {
elements: {
type: Array,
value: [{"name": "Main1", "person": fred}, {"name": "Main2", "person": tom}, {"name": "Main3", "person": fred}],
notify: true
}
}
});
</script>
</dom-module>
子組件
<dom-module id="another-component">
<template>
<style>
:host {
display: block;
}
</style>
<h3>{{element.name}}</h3>
<h4>{{element.person.name}}</h4>
<paper-button on-tap="_changeName">Change name!</paper-button>
</template>
<script>
Polymer({
is: 'another-component',
properties: {
element: {
type: Object,
notify: true
}
},
_changeName: function(){
this.set('element.person', {"name": "bobby"});
this.notifyPath('elements');
this.notifyPath('element');
this.notifyPath('element.person');
}
});
</script>
</dom-module>
謝謝,
嘿,我昨天晚上開始玩事件,我覺得這可能是真的。然而,在我的例子中,我不喜歡的是數據在數組級別上發生了變化(您將數據發送出去了,我會發現它更加乾淨,以便直接在項目中更改引用,並通過通知。你認爲這是可能的嗎? – jlengrand
感謝plunkr,順便說一句,我認爲應該可以在元素級別更改數據的原因是因爲我們使用對象的引用,所以我期望以某種方式能夠影響項目。notifyPath可以做得更高,沒有問題 – jlengrand
好吧,我修改了你的例子,讓它按照我的意願工作。你可以在這裏看到結果:http://plnkr.co/edit/4OKtToJ3J2eBJrk50PXu?p=preview 。謝謝你的幫助!順便說一句,值得注意的是,你也可以直接在人員級別通知 – jlengrand