2015-06-04 6 views
8

Używam obliczonej właściwości jako items dla dom-repeat.Wyliczona właściwość nie jest obliczana ponownie, gdy zależność macierzy jest zmutowana

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

Po zmianie zależności values właściwość nie zostanie ponownie obliczona.

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

Jeżeli zamiast mutacji values, ustawić go do nowej tablicy, to działa:

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

Jest to błąd lub oczekiwane zachowanie?

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

Odpowiedz

10

rozmawiałem z Scott Miles, członek zespołu za polimeru i mam ten powrotem:

Aby nieruchomości komputerowej prawidłowo wiązać należy użyć [[double(values.*)]].

Parametr przekazany do funkcji double będzie obiektem o właściwościach path, value i base, podobnie jak w obserwacji ścieżki.

  • path skieruje na ciąg ścieżki, która określa, czy length lub splices została zaktualizowana w tablicy,
  • value będzie wartość length lub splices i
  • base skieruje do swojej tablicy.

Przykład:

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

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

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

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

dom-repeat szablon oczekuje się pracować z kolekcją, a więc kiedy powiązać go values bezpośrednio wie, że musi mieć zakładki na elementach w values.

Obliczone właściwości nie mają żadnych takich oczekiwań, a więc [[double(values)]] nie działa w tym przypadku, ponieważ będzie aktualizować tylko wtedy, gdy sama wzmianka values zmienia, nie gdy rzeczy w zmianie tablicy. Korzystanie z values.* pozwala Polymerowi wiedzieć, że powinien zaktualizować wiązanie właściwości obliczeniowych, gdy zawartość tablicy jest zmutowana.


nie będę pisać tego tutaj w zastępstwie Scotta gdyby nie

sjmiles: @vartan: OTOH, jeśli można rozpisać czego nauczyłeś się, że to mi pomoże, czas jest moim najmniej elastyczny zasób

+1

Zauważ również, że funkcja obliczonej właściwości nie przekazuje bezpośrednio tablicy, ale jako właściwość o nazwie 'base'. Więc 'function (values) {...}' staje się 'function (info) {var values ​​= info.base; ...} ' –

+0

@ TrevorDixon Goodness, zapomniałem o tym wspomnieć! Wielkie okrzyki. Dodałem wszystkie dodatkowe szczegóły :) Dzięki za uwagę! –

Powiązane problemy