J'ai écrit quelques liaisons personnalisées à l'aide de KnockoutJS. Je ne sais toujours pas quand utiliser ko.utils.unwrapObservable(item)
En regardant le code, cet appel vérifie essentiellement si item
c'est une observable. Si c'est le cas, retournez la valeur (), si ce n'est pas le cas, renvoyez simplement la valeur. En regardant la section sur Knockout sur la création de liaisons personnalisées, elles ont la syntaxe suivante:
var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);
Dans ce cas, ils invoquent l'observable via ()
mais appellent ensuite ko.utils.unwrapObservable
. J'essaie juste de savoir quand utiliser l'un par rapport à l'autre ou si je dois toujours suivre le modèle ci-dessus et utiliser les deux.
ko.toJS(yourObject)
plutôt que d'utiliserko.utils.unwrapObservable
, si vous essayez d'obtenir une version non emballée de l'objet à passer dans un widget ou une bibliothèque tierce. En général, il est plus sûr à utiliserko.utils.unwrapObservable
pour prendre en charge les observables et les non-observables.ko.utils.unwrapObservable
. En regardant le code, il vérifie simplement s'il est observable et si c'est le cas, Knockout invoque()
pour obtenir la valeur de l'observable, sinon, il renvoie simplement la valeur de non-observable. Si tout ce qui m'intéresse est la valeur des données transmises dans la liaison, pourquoi ne puis-je pas toujours l'utiliser()
?myBinding
et que quelqu'un se lie, c'est-à-dire commedata-bind="myBinding: myValue"
.myValue
peut être une observable ou simplement une propriété simple sur le modèle de vue. Si ce n'est qu'une propriété et que je l'appelle comme une fonction, vous obtiendrez une erreur.ko.utils.unwrapObservable
vous renverra en toute sécurité la valeur indépendamment du fait que vous ayez passé une observable ou non.ko.unwrap
est disponible dans 3.0+. Si vous utilisez une version antérieure à 3.0, alorsko.utils.unwrapObservable
est toujours là.La réponse précédente est correcte, mais je passe souvent des fonctions à des liaisons personnalisées (une fonction qui vérifie les autorisations ou détermine quoi faire en fonction de quelque chose d'autre, etc.). Ce dont j'avais vraiment besoin, c'était de dérouler n'importe quelle fonction, même si ce n'est pas une fonction observable.
Ce qui suit déballe TOUT de manière récursive:
Voici un exemple de liaison personnalisée simple que j'ai écrite:
De cette façon, bindingValue contient toujours une valeur. Je n'ai pas à me soucier de savoir si j'ai passé une fonction, une observable, une valeur ou même une fonction à l'intérieur d'un observable. Cela déroulera correctement tout jusqu'à ce qu'il atteigne l'objet que je veux.
J'espère que cela aide quelqu'un.
la source