2016-04-03 49 views
1

我做了一個簡單的概念證明Polymer 1.0應用程序,演示了我的問題:JSBin檢測陣列突變

在我的問題,我使用array mutation methods改變的磁盤陣列,它包含了購物項目列表。

然而,這似乎並不如預期的工作。我dom-repeat和打印數組的長度時得到一個變化。 但是不要當我打印數組本身時,或者當我將它包裝在函數中時,獲取更改事件。

總之,這是爲什麼這樣工作?

<p>Number of items: [[list.length]]</p> 

?爲什麼這個工作?

<p>Items inline: [[list]]</p>  
<p>Observe function : [[_observe(list)]]</p> 

此外,當我取消註釋以下行(在JSBin),事情似乎爲indened工作。但我不喜歡它,因爲它有點冒險。

app.notifyPath('list', app.list.slice()); 

我已經閱讀了本發行於slice()修復跌跌撞撞:https://github.com/Polymer/polymer/issues/2068


編輯

因此,審查意見後,回答這個問題:「這是由設計「是肯定的。該陣列本身不會改變(因爲它只是一個參考),但它的屬性更改。這就是爲什麼slice()強制重新加載,因爲它創建了一個淺拷貝。

然而,人們可以說這是否正常。是的,變量list本身沒有變化本身。但將[[list]]放入HTML代碼中實際觸發了toString()。並且該函數的結果已經更改爲

我想我堅持了捎帶的length財產現在...

+0

您jsbin採樣工作正常,我在Chrome –

+0

,它只是因爲鏈接對象它只是鏈接,它並沒有改變,觀察list.length和返回列表 –

+0

或者你可以在一些var中備份鏈接到數組,通知沒有第二個參數,並立即通知備份列表,我不知道什麼更快,但這種方法不需要克隆數組,並且更多的不需要深入在複雜情況下克隆。 –

回答

2

所提到的註釋中的notifyPathslice調用創建數組的一個淺表副本,並分配一個不同的參考背list變量 - 觸發綁定的更新。如果沒有保持一個獨立的(可以觀看)變量或對象引用亂搞,唯一的解決辦法我能想到的是上捎帶上list.length屬性,而不是名單本身並傳遞通過某種「格式化」功能。 例如

<p>Items inline: [[format(list.length)]]</p> 
app.format = function(){ 
    return app.list.toString(); 
}; 

» Fiddle


正如@zb指出,你可以擴大這一點,並通過將相關變量作爲自變量也使功能上重複使用任何數組:

<p>Items inline: [[format(list, list.length)]]</p> 
如果你想知道爲什麼觀察者不會觸發3210

» Fiddle

+1

我寧願http://jsbin.com/mocagujapi/1/edit?html,js,輸出 –

+1

葉我想這會使它可重用。不管怎麼說,這個用例是相當有限的。 – Emissary

+0

@zb'和@Emissary我已經更新了一下我的問題。但是這可能不會改變問題的解決方案:捎帶'length'屬性。 – alesc