2016-10-28 1 views
4

Ich habe eine bestimmte Knockout Observable, die in vielen berechneten Funktionen verwendet wird und es funktioniert genau so, wie es soll. Bei einer dieser berechneten Funktionen möchte ich jedoch nicht, dass sie ausgelöst wird, wenn das Observable aktualisiert wird. Code weise wäre es etwa so aussehen:Wie aktualisiert man eine Observable in einer berechneten, ohne die berechnete auszulösen?

self.obs1 = ko.observable(foo); 
    self.obs2 = ko.observable(bar); 

    //I want this computed to behave normally 
    this.comp1 = ko.computed(function() { 
    return self.obs1() + self.obs2(); 
    }, this); 

    //I want this computed to trigger on obs1 update but ignore updates to obs2 
    this.comp2 = ko.computed(function() { 
    return self.obs1() + self.obs2(); 
    }, self); 

    setTimeout(function() { 
    self.obs1(20); 
    self.obs2(15);  
    }, 1000); 

https://jsfiddle.net/r73yLk5u/

Bitte beachte, dass ich noch in der Lage tun müssen, um den aktuellen Wert von OBS2 zuzugreifen, wenn comp2 ausgeführt wird, ich nicht nur das Update von OBS2 will triggern Sie comp2, um einen neuen Wert zu erhalten.

Ist das möglich?

+0

Ugh, ich weiß nicht, ob es möglich ist, aber es ist wahrscheinlich mit einigen benutzerdefinierten Extender oder so etwas. Ich denke jedoch, dass dies ein Zeichen dafür ist, dass etwas nicht stimmt, und bevor Sie weitermachen und es tun, überprüfen Sie erneut, warum Sie das wollen und wenn Sie nicht versuchen, ein [XY-Problem] zu lösen (http: // meta .stackexchange.com/questions/66377/Was-ist-das-XY-Problem). – vlaz

+0

Danke @vlaz. Sie haben wahrscheinlich recht, ich wollte mich nicht zu sehr in den Kontext verstricken. Kurz gesagt, meine Benutzeroberfläche ist zu erfrischend, aber ich kann nicht einfach eine RateLimit verwenden, da ich fast sofort Updates von 'obs1' sehen möchte, aber 'obs2', das sehr häufig aktualisiert wird, kümmert mich nie wirklich. – Nathan

+0

Haben Sie erwogen, '.extend ({throttle:/* irgendein vernünftiger Wert * /})' auf der zweiten Observablen zu verwenden? – vlaz

Antwort

2

Um es Updates zu einer beobachtbaren machen zu ignorieren, verwenden peek (docs):

Die peek Funktion können Sie eine beobachtbare Zugriff oder beobachtbaren berechnet, ohne eine Abhängigkeit zu schaffen.

Aktualisiert Beispiel:

//I want this computed to trigger on obs1 update but ignore updates to obs2 
    this.comp2 = ko.computed(function() { 
    return self.obs1() + self.obs2.peek(); 
    }, self); 

https://jsfiddle.net/r73yLk5u/2/

0

Okay, also habe ich herausgefunden, wie das geht. Wenn Sie eine neue Berechnung erstellen, die nur die Observable zurückgibt, die Sie verzögern möchten, dann rateLimit sie auf einen Punkt, den sie niemals treffen wird, können Sie einfach das anstelle der Observable berechnete verwenden. Dies wird auch dazu führen, dass es immer den aktuellen obs2-Wert verwendet, sollte der berechnete Wert aus irgendeinem anderen Grund in der Zukunft ausgelöst werden.

self.obs2DelayComp = ko.computed(function() { 
    return self.obs2(); 
    }).extend({ rateLimit: 3001 }); 

https://jsfiddle.net/r73yLk5u/1/

Verwandte Themen