2015-06-04 4 views
8

dom-repeat için items olarak hesaplanmış özellik kullanıyorum. onun bağımlılık values değişiklikler, mülkiyet recomputed değildirDizinin bağımlılığı mutasyona uğradığında hesaplanan özellik yeniden hesaplanmaz

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

.

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

bu bir hata veya beklenen davranış mı: yerine values mutasyona arasında, yeni bir diziye ayarlayın

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

ise, çalışır?

Demo: Scott Miles, Polymer arkasında ekibinin bir üyesi ile konuştum ve ben geri aldım http://plnkr.co/edit/SmAHKMHhSPWgmBhBBzAv?p=preview

cevap

10

: Düzgün bağlamak için

amacıyla bilgisayarlı özellik için, sen [[double(values.*)]] kullanmalıdır. senin double işlevine iletilen

parametre sadece yol gözlem olduğu gibi base özellikleri path, value sahip bir nesne olacak ve.

  • path
  • value
  • sizin diziyi ifade edecektir length veya splices ve
  • base değeri olacak, length veya splices dizide güncelleştirildiyse belirten bir yol dizesi ilgili olacak.

Örnek:

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

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

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

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

bir dom-repeat şablon koleksiyonu ile çalışmaktan beklediği

ve böylece bağlamak doğrudan values için, values'daki öğeler üzerinde sekmeleri tutmayı bilir.

Bilgisayarlı özellikleri, bu tür beklentileri yok ve values referans kendisi değiştiğinde sadece güncellenir çünkü böylece [[double(values)]] bu durumda çalışmıyor değilzaman dizi değişikliğe öğeler. values.*'u kullanmak, Polymer'in dizinin içeriği değiştiğinde, hesaplanan özellik bağını güncelleştirmesi gerektiğini bilmesini sağlar.


değil

sjmiles için eğer Scott'ın yerine burada bu yazı olmaz

: @vartan: OTOH, öğrendiklerini uyarlamak mümkün olsaydı, o bana yardım edeceğini, zaman benim azından Elastik kaynak

+1

Ayrıca, hesaplanan özellik işlevinin artık diziyi artık doğrudan geçmediğine, ancak "base" adlı bir özellik olarak görüldüğüne dikkat edin. Yani 'function (values) {...}' işlevi (info) olur {vari values ​​= info.base; ...} ' –

+0

@TrevorDixon İyilik, bundan bahsetmeyi ihmal ettim! Büyük whoops. Ekstra detayı ekledim :) Fark ettiğin için teşekkürler! –