2012-01-15 16 views
8

Tengo algo como esto:¿Cómo hago una propiedad calculada y filtrada?

Epic = Ember.Object.extend({ 
    children:[], 
    children_filtered: function(){   
     return this.get("children").filterProperty("archived",false); 
    }.property("children"), 
    init: function() { 
     this._super(); 
     this.set("children", Ember.ArrayController.create({content:[]})); 
     this.set("stories", Ember.ArrayController.create({content:[]})); 
    }, 
}); 

Nota la propiedad computarizada children_filtered.

Si uso children_filtered en una vista ...

{{#each content.children_filtered }} 
    hi 
{{/each}} 

Mi aplicación se bloquea con la CPU @ 100%

Alguna idea de lo que estoy haciendo mal? ¿Hay un mejor patrón a seguir para un objeto que tiene una lista de elementos más una lista de elementos filtrados?

Respuesta

12

Su problema es que necesita que la propiedad calculada se establezca como cacheable. De lo contrario, su valor se vuelve a calcular en cada iteración del #each. Se ha debatido si cacheable debe ser el valor predeterminado para todas las propiedades calculadas.

children_filtered: function(){   
    return this.get("children").filterProperty("archived",false); 
}.property("children").cacheable() 

Aquí está un ejemplo jsFiddle: http://jsfiddle.net/ebryn/9ZKSY/

+0

Gracias! Tu rock –

+4

La discusión de Github sobre cómo hacer que la memoria caché sea la predeterminada está aquí: https://github.com/emberjs/ember.js/issues/38 –

+1

Y ahora es la predeterminada: http://emberjs.com/api/classes/Ember .ComputedProperty.html # method_cacheable –

Cuestiones relacionadas