2016-04-22 57 views
2

我有一個dom-repeat模板,它生成錶行,其中一個行單元格包含一個按鈕,我想要在行值具有特定值時禁用。所以,我的分量有這個代碼,它使用一個計算結合設置按鈕的disabled屬性的值:聚合物計算綁定不會得到重新計算更新

<template is="dom-repeat" items="{{list}}" as="ticket"> 
    <tr class$="{{ticket.status}}"> 
     <td class="actions"> 
      <paper-icon-button icon="add" on-tap="incTickets" 
       disabled="{{noAvailableTickets(ticket)}}"> 
      </paper-icon-button> 
     </td> 
     <td>[[ticket.amount]]</td> 
     <td>[[ticket.event.title]]</td> 
    </tr> 
</template> 

而在我的代碼,我有這樣的方法:

noAvailableTickets : function(ticket) { 
    return ticket.event.available_tickets <= 0; 
} 

我可以看到,計算的綁定方法在列表首次創建時調用,每個項目一次。

後來,當我更新的項目,如:

this.set('list.' + ind + '.amount', newamount); 

的計算綁定不會recalcuated,並且該方法不再調用,即使我能看到的值實際上在ticket.amount顯示在改變模板。

Polymer Data Binding entry in the developer's guide是這樣說的有關計算綁定:

的[...]屬性綁定到的computeFullName的返回值,這是重新計算時第一個或最後一個變化。 [firstlast是聲明的參數爲computeFullName]

所以假設下計算出的結合是不知道的對象的值,其amount屬性以及如何其他邏輯使用之間的相關性的此更新available_tickets屬性,我試圖添加notifyPath命令與全更新的對象,像這樣:

this.notifyPath('list.' + displayId, ticket); 

但似乎沒有任何效果。我錯過了什麼?

+0

我知道這已被回答,但你有沒有考慮過使用'this.push('path',value)'而不是'this.set'? – Alan

+0

'push'添加到數組中,但我不想添加其他項目,只需更新現有項目即可。 – Guss

回答

2

我懷疑notifyPath由於its dirty check沒有在您的案例中觸發更新。也就是說,list[0]ticket指向同一個實例(儘管實例的屬性已更改),因此它不被視爲「髒」。

我的jsbin實驗表明,將list[0]設置爲修改的克隆實際上會觸發更新。

attached: function() { 
    setTimeout(function() { 
    var copy = this.list[0].clone(); 
    copy.amount = 'FREE'; 
    this.set('list.0', copy); 
    }.bind(this), 1000); 
} 

但這可能不是實現這一目標的最佳方法。

根據聚合物docs,觸發計算的結合每當ticket子屬性的變化,你會在你的綁定使用ticket.*

<paper-icon-button disabled="{{noAvailableTickets(ticket.*)}}"> 
Polymer({ 
    ... 
    noAvailableTickets: function(change) { 
    var ticket = change.base; 
    return ticket.event.available_tickets <= 0; 
    } 
}); 

這裏有一個jsbin