knockout.js - update - select value binding knockout




Erzwingt das Ausführen einer berechneten Eigenschaftsfunktion (4)

Gegeben eine berechnete Eigenschaft

vm.checkedValueCount = ko.computed(function(){
  var observables = getCurrentValues();  //an array of ko.observable[]
  return _.filter(observables, function(v) { return v() }).length;
});

angenommen, getCurrentValues ​​() kann verschiedene Sätze von Observablen zurückgeben, die an anderer Stelle im Code modifiziert sind (und von einer komplexeren Struktur als einem observableArray stammen).

Ich brauche checkedValueCount , um checkedValueCount zu aktualisieren

  • eine seiner Abhängigkeiten ändert sich
  • getCurrentValues ​​() gibt einen anderen Satz von Observablen zurück.

Das Problem ist, dass ko.computed scheinbar den letzten zurückgegebenen Wert enthält und nur aktualisiert wird, wenn eine Abhängigkeit aktualisiert wird. Dies behandelt den ersten Fall, aber nicht den letzteren.

Was ich suche, ist eine Möglichkeit, checkedValueCount erneut auszuführen. Etwas was ich benutzen kann wie:

changeCurrentValues();
vm.checkeValueCount.recalculate();

Einfach ausgedrückt, vorausgesetzt, ich habe

a = ko.computed(function() { return Math.random() })

Wie kann ich den Aufruf von a() zweimal erzwingen, um verschiedene Werte zurückzugeben?


Angenommen, getCurrentValues ​​() kann verschiedene Sätze von Observablen zurückgeben, die an anderer Stelle im Code geändert werden

Ich nehme an, getCurrentValues ​​() ist eine Funktion. Wenn Sie es zu einer berechneten machen könnten, würde Ihr checkedValueCount einfach magisch anfangen zu arbeiten.

Können Sie getCurrentValues ​​zu einer berechneten anstelle einer Funktion machen?


Da es keinen direkten Weg gibt, um ein Update zu erzwingen, habe ich ein beobachtbares namens toForceComputedUpdate erstellt, und ich habe es innerhalb der berechneten Funktion aufgerufen, so dass das Errechnete auf sein Update hört, um dann ein Update zu erzwingen, das ich wie folgt toForceComputedUpdate (Math .zufällig)


Es gibt eine Methode , um die Neuberechnung aller Observablen zu erzwingen:

getCurrentValues.valueHasMutated()

Ich habe bemerkt, dass meine erste Antwort Ihren Standpunkt verfehlt hat und Ihr Problem nicht lösen wird.

Das Problem besteht darin, dass ein berechneter Wert nur dann neu bewertet wird, wenn es eine beobachtbare Variable gibt, die eine Neubewertung erzwingt. Es gibt keine native Methode, um zu erzwingen, dass ein Computer neu bewertet wird.

Sie können dies jedoch mit Hackereien umgehen, indem Sie einen beobachtbaren Dummy-Wert erstellen und den Abonnenten mitteilen, dass sich der Wert geändert hat.

(function() {

    var vm = function() {
        var $this = this;

        $this.dummy = ko.observable();

        $this.curDate = ko.computed(function() {
            $this.dummy();
            return new Date();
        });

        $this.recalcCurDate = function() {
            $this.dummy.notifySubscribers();
        };        
    };

    ko.applyBindings(new vm());

}());​

Hier ist eine Geige, die diesen Ansatz zeigt