Déterminer si une propriété d'objet est ko.observable

98

J'utilise KnockoutJS version 2.0.0

Si je parcourt toutes les propriétés d'un objet, comment puis-je tester si chaque propriété est un ko.observable? Voici ce que j'ai essayé jusqu'à présent:

    var vm = {
        prop: ko.observable(''),
        arr: ko.observableArray([]),
        func: ko.computed(function(){
            return this.prop + " computed";
        }, vm)
    };

    for (var key in vm) {
        console.log(key, 
            vm[key].constructor === ko.observable, 
            vm[key] instanceof ko.observable);
    }

Mais jusqu'à présent, tout est faux.

Adam Rackis
la source

Réponses:

157

Knockout inclut une fonction appelée ko.isObservable(). Vous pouvez l'appeler comme ça ko.isObservable(vm[key]).

Mise à jour à partir du commentaire:

Voici une fonction pour déterminer si quelque chose est une observable calculée:

ko.isComputed = function (instance) {
    if ((instance === null) || (instance === undefined) || (instance.__ko_proto__ === undefined)) return false;
    if (instance.__ko_proto__ === ko.dependentObservable) return true;
    return ko.isComputed(instance.__ko_proto__); // Walk the prototype chain
};

MISE À JOUR: Si vous utilisez KO 2.1+, vous pouvez l'utiliser ko.isComputeddirectement.

RP Niemeyer
la source
2
Je vous remercie. Savez-vous par hasard comment savoir si une observable est calculée? Je peux déterminer si une observable est un tableau observable via $.isArray(vm[key]()), mais savez-vous comment différencier les observables d'un ko.computed??
Adam Rackis
7
KO 2.1 qui devrait sortir dans les prochaines semaines comprendra une ko.isComputedfonction. Le code serait l'équivalent de ce que j'ai ajouté à la réponse ci-dessus.
RP Niemeyer
27

Knockout a la fonction suivante qui, je pense, est ce que vous recherchez:

ko.isObservable(vm[key])
Mark Robinson
la source
3

Pour revenir à la réponse de RP Niemeyer, si vous cherchez simplement à déterminer si quelque chose est "souscriptible" (ce qui est le plus souvent le cas). Puis ko.isSubscribableest également disponible.

pimbrouwers
la source
0

j'utilise

ko.utils.unwrapObservable(vm.key)

Mise à jour : à partir de la version 2.3.0, a ko.unwrapété ajouté en remplacement deko.utils.unwrapObservable

Ivan Rodriguez
la source
2
Cela déballe un observable. Il ne teste pas si une propriété est une observable.
Adam Rackis
1
Vous avez raison. Mais généralement si vous avez besoin de savoir pour obtenir la valeur observable réelle;)
Ivan Rodriguez
1
Il fournit un moyen valide d'accéder à une propriété qui peut ou non être observable, mais il ne répond pas à la question en soi.
Ozil