2015-06-04 36 views
8

我使用items的計算屬性作爲dom-repeat當數組依賴關係發生變化時,計算屬性不會重新計算

<template is="dom-repeat" items="{{double(values)}}"> 
    <span>{{item}}</span> 
</template> 

當其依賴values變化,屬性不重新計算。

addValue: function() { 
    this.push('values', this.values.length+1); 
    this.async(this.addValue, 1000); 
}, 

如果代替變異values,我將其設置爲一個新的數組,它的工作:

this.set('values', this.values.concat(this.values.length+1)) 

這是一個錯誤的或預期的行爲?

演示:http://plnkr.co/edit/SmAHKMHhSPWgmBhBBzAv?p=preview

回答

10

我與斯科特·邁爾斯,背後聚合物團隊的成員說話,我這回:

爲了計算財產正確綁定,則必須使用[[double(values.*)]]

傳遞給您的double函數的參數將是一個具有屬性path,valuebase的對象,就像在路徑觀察中一樣。

  • path將參考指定如果lengthsplices陣列中被更新的路徑字符串,
  • value將是lengthsplices,並且
  • base值將參考您的陣列。

例子:

<template is="dom-repeat" items="[[double(values.*)]]"> 
    <span>[[item]]</span> 
</template> 

<script> 
    ... 
    double: function(e) { 
    return e.base.map(function(n) { return n*2; }); 
    } 

文檔:https://www.polymer-project.org/1.0/docs/devguide/properties.html#array-observation

演示:http://plnkr.co/edit/Idrz5XvLn9SZ35iR8pGT?p=preview

一個dom-repeat模板,希望用收集來的工作,因此,當你將其綁定到values直接,它知道要保留在values中的項目標籤。

計算屬性沒有任何這樣的預期,所以[[double(values)]]不會在這種情況下工作,因爲當values參考本身的變化將只更新,不在陣列變化的項目。使用values.*讓Polymer知道它應該在數組內容發生變化時更新計算的屬性綁定。


我就不會在這裏斯科特代替,如果不是

sjmiles發佈此:@vartan:OTOH,如果你可以錄製你學到了什麼,它會幫助我,時間是我最彈性資源

+1

另請注意,計算屬性的函數不會直接傳遞數組,而是作爲名爲'base'的屬性。所以'function(values){...}'變成'function(info){var values = info.base; ...} –

+0

@TrevorDixon善良,我忽略提及!大哎呀。我添加了所有額外的細節:)感謝您的注意! –

相關問題