it-swarm.com.de

Wann sollte ko.utils.unwrapObservable verwendet werden?

Ich habe einige benutzerdefinierte Bindungen mit KnockoutJS geschrieben. Ich bin mir immer noch nicht sicher, wann ich ko.utils.unwrapObservable(item) verwenden soll. Beim Betrachten des Codes prüft dieser Aufruf grundsätzlich, ob item eine beobachtbare Zahl ist. Wenn dies der Fall ist, geben Sie den Wert () zurück. Wenn dies nicht der Fall ist, geben Sie einfach den Wert zurück. Im Abschnitt zu Knockout zum Erstellen benutzerdefinierter Bindungen wird die folgende Syntax verwendet:

var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);

In diesem Fall rufen sie die Observable über () Auf, rufen dann aber auch ko.utils.unwrapObservable Auf. Ich versuche nur in den Griff zu bekommen, wann man eins gegen das andere benutzt oder ob ich einfach immer dem obigen Muster folgen und beides benutzen soll.

111
arb

Sie sollten ko.utils.unwrapObservable In Fällen verwenden, in denen Sie nicht wissen, ob Sie ein Observable erhalten haben oder nicht. Dies würde üblicherweise in einer benutzerdefinierten Bindung erfolgen, in der ein beobachtbares oder nicht beobachtbares Objekt dagegen gebunden werden könnte.

In dem Code, den Sie oben haben, ist der Aufruf von valueAccessor() nicht wirklich ein Observable auspacken. Es wird nur der Wert abgerufen, der im richtigen Kontext an die Bindung übergeben wurde (es wird in eine Funktion eingeschlossen, um sie zu schützen). Der Rückgabewert von valueAccessor() kann beobachtbar sein oder nicht. Es ist alles, was an die Bindung weitergegeben wurde.

139
RP Niemeyer

Die frühere Antwort ist richtig, aber ich übergebe häufig Funktionen an benutzerdefinierte Bindungen (eine Funktion, die Berechtigungen überprüft oder basierend auf etwas anderem usw. festlegt, was zu tun ist). Was ich wirklich brauchte, war, jede Funktion zu entpacken, auch wenn es keine beobachtbare ist.

Folgendes packt ALLES rekursiv aus:

ko.utils.unwrapFunction = function (func) {
    if (typeof func != 'function') {
        return func;
    }
    else {
        return ko.utils.unwrapFunction(func());
    }
};

Hier ist ein Beispiel einer einfachen benutzerdefinierten Bindung, die ich geschrieben habe:

//replaces single and double 'smart' quotes users commonly paste in from Word into textareas and textboxes with normal text equivalents
//USAGE:
//data-bind="replaceWordChars:true
//also works with valueUpdate:'keyup' if you want"

ko.bindingHandlers.replaceWordChars = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var bindingValue = ko.utils.unwrapFunction(valueAccessor);

        if (bindingValue) {
            $(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me
            allBindingsAccessor().value($(element).val()); //update viewModel
        }
    }
}

Auf diese Weise enthält bindingValue immer einen Wert. Ich brauche mir keine Sorgen zu machen, ob ich eine Funktion, ein Observable, einen Wert oder sogar eine Funktion innerhalb eines Observable übergeben habe. Dadurch wird alles ordnungsgemäß entpackt, bis das gewünschte Objekt erreicht ist.

Hoffe das hilft jemandem.

11
pilavdzice