2016-07-20 6 views
0

Neulich fragte ich eine Frage (here). Jemand hat freundlich geantwortet, und ihre Antwort tut, was ich ursprünglich dazu beabsichtigt hatte. Allerdings gibt es einen Code, den ich nicht verstehe, und ich hatte gehofft, dass mir jemand helfen könnte.Javascript Funktion Erklärung - Knockout.js

self.currentlySelected = ko.computed(function() { 
    return self.topics().reduce(function(count, topic) { 
     return count + (topic.selected() ? 1 : 0); 
    }, 0); 
    }); 

Würde jemand freundlich genug sein zu erklären, was diese Funktion macht? Vielen Dank!

+0

Ich sehe viele Funktionen ... Welche versuchen Sie zu verstehen? '.reduce'? '.computed'? –

+0

Die Reduzierungsfunktion. Ich denke ich verstehe, was die .reduce-Funktion tut, aber ich verstehe nicht, wie es im Kontext funktioniert. –

Antwort

1

Es wird ein Verfahren auf der Liste der Themen reduzieren verwendet, wird jedes Element in Ihren Themen beobachtbaren Array durchlaufen, um zu sehen, zu überprüfen, ob es ausgewählt wird, und dann das Hinzufügen all diese auf. es könnte auch so aussehen:

self.currentlySelected = ko.computed(function() { 
    var count = 0 
    for(var i = 0; i < self.topics().length; i++){ 
    var topic = self.topics()[i] 
    if(topic.selected()){ 
     count += 1; 
    } 
    } 
    return count 
}); 

die .reduce Methode stammt JavaScript-Methode und kann Here

die .computed Methode ist knockout.js und ist ziemlich gut Here

+0

Ahhh, ich verstehe. Das ist viel einfacher und ich sehe, wie die Reduce-Funktion jetzt funktioniert. Vielen Dank. –

2

Es besagt, dass currentlySelected eine berechnete Eigenschaft ist - um seinen Wert zu sehen, müssen Sie eine Funktion auswerten.

Die Funktion sagt:

1. Get the topics 
2. Reduce the topics down to a single value, using the following function 
3. If the topic is selected, add 1 to our running total (count). 
    Otherwise, add 0. Our initial value for count is 0. 
1

erklärt gefunden werden Lassen Sie uns von innen nach außen gehen

self.topics().reduce(/* code... */, 0) - dies ruft Array.prototype.reduce() auf dem Array in self.topics gespeichert. Diese Funktion arbeitet an einer Sammlung und reduziert sie auf einen einzelnen Wert - in diesem Fall ist es count + (topic.selected() ? 1 : 0), also gibt es die Anzahl der ausgewählten Themen zurück. Der letzte Teil, der die letzte Null nach dem Zählcode self.topics().reduce(/* code... */, 0) ist, ist der Anfangswert Wert der Zählung. Also, es beginnt bei Null, zählt jedes ausgewählte Thema, gibt das Ergebnis zurück.

ko.computed(function() { /* reduction code */ }); erstellt eine computed observable, die eine Knockout observable ist, die automatisch ändert, wenn Observablen es auf Änderung beruht. In diesem Fall ist dies self.topics - jede Änderung an diesen (wie das Hinzufügen/Entfernen von diesen) würde dazu führen, dass self.currentlySelected neu berechnet wird, so dass es immer die ... aktuell ausgewählten Elemente anzeigen würde. Ihre Zählung, genauer gesagt.