2017-11-24 2 views
0

Ich habe einen Filter bekam die einmal, mit dem, was Werte sind vorinitialisiert in nur bei Anfangs initiazation funktioniert, aber nie Updates. editstate ist ein Service; In diesem Fall werden nur die exponierten Variablen bereitgestellt. Wenn also editstate.filterValue und editstate.filterField geändert werden, sollte der Filter aktualisiert werden.Force computed.filter() zu aktualisieren?

Aber es funktioniert nicht.

Ich habe versucht, sie vor Ort auch berechnete Werte aufweisen, aber keine Würfel. Die einzige programmatische Sache, die bisher funktioniert, besteht darin, die gesamte Komponente mit Hilfe eines Steuerknüppels {{#if toggle zu rendern und neu zu rendern.

export default Ember.Component.extend({ 
    store: Ember.inject.service(), 
    editstate: Ember.inject.service('edit-state'), 
    filteredList: Ember.computed.filter('model', function(current, index, all) { 
      return current.get(Ember.get(this.get('editstate'), 'filterField')) == Ember.get(this.get('editstate'), 'filterValue'); 
    }), 

Was fehlt mir? Ich sehe keine API, um einen Filter zu erzwingen, ihn neu zu berechnen, oder um es explizit zu sagen, diese Werte zu beobachten.

aktualisieren: Ich fand einen schrecklich hacky Weg, um mein Ziel zu erreichen: In meinem Dienst, ich schaff' aber nicht einen Datensatz im Modell speichern, die ich Filterung, um nur Updates zu erzwingen. Wenn sich die Filterparameter ändern, aktualisiere ich diesen Datensatz mit der aktuellen Zeit (millis). Und natürlich wird es immer vom Filter herausgefiltert.

Es ist hässlich, es ist wahrscheinlich böse ... gibt es einen besseren Weg?

Antwort

0

jede Variable Definieren Sie berechnete Definition (die Sie in berechneter Funktion):

export default Ember.Component.extend({ 
    store: Ember.inject.service(), 
    editstate: Ember.inject.service('edit-state'), 
    filteredList: Ember.computed('model', 'editstate.filterField', 'editstate.filterValue', function() { 
    return this.get('model').filter((current) => { 
     return current.get(Ember.get(this.get('editstate'), 'filterField')) === Ember.get(this.get('editstate'), 'filterValue'); 
    } 
    }), 
    ... 

oder sogar besser lesbar:

export default Ember.Component.extend({ 
    store: Ember.inject.service(), 
    editstate: Ember.inject.service('edit-state'), 
    filteredList: Ember.computed('model', 'editstate.filterField', 'editstate.filterValue', function() { 
    let filterField = Ember.get(this, 'editstate.filterField'); 
    let filterValue = Ember.get(this, 'editstate.filterValue'); 
    return this.get('model').filterBy(filterField, filterValue); 
    }), 
    ... 
+1

Ich erhalte, dass der „Callback-Anruf ist keine Funktion "; Es sieht nur aus der [Ember Quelle für Filter] (https://github.com/emberjs/ember.js/blob/v2.15.3/packages/ember-runtime/lib/computed/reduce_computed_macros.js#L309), nur filtern nimmt einen Schlüssel (array_macro), die nur Griffe [ein dependentKey Wert] (https://github.com/emberjs/ember.js/blob/v2.15.3/packages/ember-runtime/lib/computed/reduce_computed_macros.js# L34). Sollte ich eine andere Funktion verwenden? Eine andere Möglichkeit, diese Variablen hinzuzufügen? – TCat

+0

Ooo, das ist mein Fehler, Code bearbeitet – ykaragol

+0

Um die Aktualisierungen des 'Modells' zu behandeln, sollten Sie' modell. [] 'anstelle von' Modell' in der berechneten Definition verwenden. Siehe [cuted-properties-and-aggregate-data] (https://guides.emberjs.com/v2.16.0/object-model/computed-properties-and-aggregate-data/#toc_code-code-vs-code- each-code) – ykaragol

Verwandte Themen