Determine se uma propriedade de objeto é ko.observable

98

Estou usando o KnockoutJS versão 2.0.0

Se estou percorrendo todas as propriedades de um objeto, como posso testar se cada propriedade é um ko.observable? Aqui está o que tentei até agora:

    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);
    }

Mas até agora tudo é falso.

Adam Rackis
fonte

Respostas:

157

Knockout inclui uma função chamada ko.isObservable(). Você pode chamá-lo assim ko.isObservable(vm[key]).

Atualização do comentário:

Aqui está uma função para determinar se algo é um observável computado:

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
};

ATUALIZAÇÃO: Se você estiver usando KO 2.1+ - então você pode usar ko.isComputeddiretamente.

RP Niemeyer
fonte
2
Obrigado. Você por acaso sabe como saber se um observável é computado? Posso determinar se um observável é um array observável via $.isArray(vm[key]()), mas você sabe como diferenciar observáveis ​​de um ko.computed??
Adam Rackis
7
KO 2.1 que deve sair nas próximas semanas incluirá uma ko.isComputedfunção. O código seria o equivalente ao que adicionei à resposta acima.
RP Niemeyer
27

Knockout tem a seguinte função que eu acho que você está procurando:

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

Para continuar com a resposta de RP Niemeyer, se você está simplesmente procurando determinar se algo é "assinável" (o que geralmente é o caso). Então ko.isSubscribabletambém está disponível.

pimbrouwers
fonte
0

estou a usar

ko.utils.unwrapObservable(vm.key)

Atualização : a partir da versão 2.3.0, ko.unwrapfoi adicionado como substituto parako.utils.unwrapObservable

Ivan Rodriguez
fonte
2
Isso revela um observável. Não testa se uma propriedade é observável.
Adam Rackis
1
Você está certo. Mas geralmente se você precisa saber para obter o valor observável real;)
Ivan Rodriguez
1
Ele fornece uma forma válida de acessar uma propriedade que pode ou não ser observável, mas não responde à pergunta em si.
Ozil