Backbone.js – Todo-Sammlung – Was genau passiert in dieser Rückgabeerklärung?

Lesezeit: 4 Minuten

Ich sehe mir die Aufgabenliste von Backbone noch einmal an und habe eine Frage zur Sammlung.

Hier ist der Code:

window.TodoList = Bacbone.Collection.extend({

        model: Todo,

        localStorage: new Store("todos"),

        done: function() {
            return this.filter(function(todo){return todo.get("done")})
        },

        remaining: function() {
            return this.without.apply(this, this.done());
        }



    })

Ich verstehe alles, was hier vor sich geht, bis auf die ‘verbleibende’ Funktion.

Die Rückgabeerklärung: return this.without.apply(this, this.done()); verwendet einen Proxy für eine Unterstrichmethode – _.without

Laut Underscore-Dokumentation ist hier, wofür das ist:

ohne_.ohne(Array, [*values]) Gibt eine Kopie des Arrays zurück, wobei alle Instanzen der Werte entfernt wurden. === wird für den Gleichheitstest verwendet.

_.ohne([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]

Ich verstehe also, dass es heißt, alles in der Sammlung ohne ein Attribut „done“ mit dem Wert „true“ zurückzugeben.

Was ich nicht verstehe, ist die ‘Apply’-Funktion, die damit verkettet ist. Das erscheint nicht in den Backbone-Dokumenten oder den Underscore-Dokumenten. Zumindest finde ich es nirgends.

Kann jemand im Detail erklären, was mit diesen Elementen in der Return-Anweisung los ist?

Benutzer-Avatar
Trevor

this bezieht sich auf die Sammlung.

apply ist eine Methode von Javascript-Funktionen, mit der Sie den Kontext einer Methode festlegen und ein Array von Werten an den Aufrufer senden können.

apply erwartet Kontext als ersten Parameter, dann an array oder Array-artig (wie zum Beispiel arguments), die der Funktion als Parameter übergeben werden.

Das gleiche kannst du auch mit machen .call außer dass die 2.+ Parameter durch Kommas getrennt sind.

apply und call stammen aus Javascript.

So…

return this.without.apply(this, this.done());

die Methode this.done() gibt ein Array zurück, verwendet aber den Kontext der Sammlung und übergibt eine Reihe von Werten, die über ignoriert werden sollen without Methode. Was wiederum alle Aufgaben zurückgibt, die nicht innerhalb der Sammlung erledigt sind.

Beispiel:

_.without([1,2,3,4],1,2); === _.without.call([], [1,2,3,4], 1, 2);

  • Vielen Dank. Der Teil, den ich nicht grokked, war die Funktion without hat seine eigenen Methoden. So apply (und call) sind Methoden der without Funktion. Sie dienen zum Aufrufen einer Funktion, als wäre es eine Methode eines anderen Objekts. Ich bin mir ziemlich sicher, wie @j4w7 unten anmerkt, dass es in diesem Fall eigentlich überflüssig ist without‘s this ist schon gebunden this. Also jederzeit sehen this.fn.apply(this,...) === this.fn(...) es sei denn, Sie haben Grund, das zu glauben fn‘s this wurde mit geändert bind/bindAll.

    – Ted Naleid

    6. September 2012 um 2:09 Uhr

  • Soweit es mich betrifft, geht es nicht um die Bindung von “this” – es ist eine (leicht hackige) Möglichkeit, ohne () ein Array von Werten zu übergeben, die entfernt werden sollten. “ohne()” will die Werte, die als Argumente entfernt werden sollen. Und mit apply(thisValue,argumentArray) wird der Inhalt des Arrays als Argumente übergeben, nicht als das Array selbst.

    – JanD

    13. Februar 2013 um 20:50 Uhr


Benutzer-Avatar
j4w7

Mein Verständnis ist, dass in diesem Fall die Verwendung von apply ist überflüssig, remaining könnte wie folgt gekürzt werden:

remaining: function() {
  return this.without(this.done());
}

Wie ich es verstehe, der einzige Grund zu verwenden apply ist wenn du willst (oder brauchen), um das Kontextelement that zu ändern without wird weiter operieren. In diesem Fall müssen wir das nicht tun.

Wenn ich falsch liege, hätte ich wirklich (wirklich!) gerne eine Erklärung dafür apply ist hier notwendig.

apply ruft eine Funktion auf und bindet this im Kontext dieser Funktion zum ersten übergebenen Argument (in diesem Fall die Collection-Instanz). TodoList). Das zweite Argument ist ein Array von Argumenten, an das übergeben werden soll without.

Übrigens, apply ist keine Backbone-Sache – es ist in JavaScript nativ.

Benutzer-Avatar
Juan Cortines

Der Grund hierfür

this.without.apply(this, this.done())

ist, dass “_.without” das Array der auszuschließenden Elemente nicht als ein einzelnes Array akzeptiert ([]) Streit

Siehe hier _.ohne Array als zweites Argument zu akzeptieren

anwendendas Teil von JS Function.prototype ist, finden Sie hier eine Problemumgehung, um die ausschließenden Elemente in ein einzelnes Array-Argument einzufügen

Die Verwendung von apply ist in diesem Fall überflüssig, da Backbone-Sammlungen die Arbeit korrekt erledigen, vgl. http://backbonejs.org/docs/backbone.html#section-122

Wir können Unterstriche wie folgt verwenden: _.without.apply(this, this.done()) oder Backbone-Bindung wie folgt: this.without(this.done) durch Verwendung von Backbone-Bind.

Benutzer-Avatar
Zhe Xiao

Bitte werfen Sie einen Blick auf das Unterstrich-Dokument: so:

ohne_.ohne(Array, [*values]) Gibt eine Kopie des Arrays zurück, wobei alle Instanzen der Werte entfernt wurden.

_.ohne([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]

Ich habe die Funktion so geändert und genau das gleiche Ergebnis in der TODO-Listenanwendung erhalten:

remaining: function () {
        return this.filter(function (todo) {
            return !todo.get('done');
        });
}

Ich habe immer noch nicht verstanden, wie apply zu einer Methode ohne wurde, ich wusste, apply war eine Javascript-Funktion, aber dann las ich die Unterlagen zur Bewerbung und verstanden, dass in diesem Fall without objektorientiert verwendet wurde (vgl http://underscorejs.org/#chain).

In der Tat, anwenden bestanden werden konnte Null Anstatt von Dies als Kontext und es würde das Ergebnis nicht ändern, weil es überhaupt nicht verwendet wird:

return this.without.apply(null, this.done());

Beachten Sie das erste Dies ist die eigentliche Sammlung von Modellen und ohneüber das zweite Argument in anwendendas das Array erledigter (erledigter) Aufgaben ist, erzeugt das Array ausstehender Todo-Aufgaben.

Übrigens benennt die neueste Version der TODO-Anwendung die Funktion um erledigt zu abgeschlossen.

1051150cookie-checkBackbone.js – Todo-Sammlung – Was genau passiert in dieser Rückgabeerklärung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy