2015-04-28 6 views
8

Sembra che restituiscano lo stesso risultato, perché utilizzare uno sull'altro?Differenza tra isObservable ed isSubscribable

var computed = ko.computed(function(){return 'foo';}); 
var observable = ko.observable(); 
var observableArray = ko.observableArray(); 

console.log('computed isObservable', ko.isObservable(computed)); 
console.log('observable isObservable', ko.isObservable(observable)); 
console.log('observableArray isObservable', ko.isObservable(observableArray)); 

console.log('computed isSubscribable', ko.isSubscribable(computed)); 
console.log('observable isSubscribable', ko.isSubscribable(observable)); 
console.log('observableArray isSubscribable', ko.isSubscribable(observableArray)); 

Tutti i dati sono veritieri. http://jsfiddle.net/1fvjuj9v/1/

+0

isSubscribable non è incorporato, fa parte di un pub/sub plug-in – Anders

+0

No, 'ko.isSubscribable' fa sicuramente parte di KO. – Retsam

risposta

6

Quindi un oggetto abbonabile è un oggetto a eliminazione diretta, diverso da osservabili o calcoli, ma ereditato da entrambi i parametri osservabili e i calcoli. Un abbonabile è tutto ciò che può essere sottoscritto; tutto ciò che può emettere eventi che altre parti del codice possono ascoltare. È da dove viene derivata la funzionalità observable.subscribe(function() {}).

Un osservabile, d'altra parte, è un tipo specifico di abbonabile: è un abbonabile che contiene un valore e che emette il nuovo valore per i suoi abbonati ogni volta che tale valore cambia. La parte "ha un valore corrente" dell'osservabile non è una parte inerente dell'essere una "sottoscrivibile", solo la parte "emette eventi per i suoi abbonati" è.

non è usato molto, ma si può costruire subscribables direttamente, e passerà il test ko.isSubscribable ma sicuro il test ko.isObservable, quindi la differenza tra questi due metodi.

Anche se personalmente non l'ho visto fare in pratica, this blog post fornisce un esempio di come è possibile utilizzare o estendere la funzionalità ko.subscribable, creando un'interfaccia Pub/Sub in aggiunta agli abbonati.

La relazione è illustrata da questa tabella dal numero knockout documentation on custom functions. Chart displaying the relation between


noti, tuttavia, che la tabella di cui sopra è un po 'ingannevole su un punto: ko.computed provenga effettivamente dalle ko.observable non dal ko.subscribable direttamente. Quindi perché ko.isObservable(computed) restituisce true. Tuttavia, la relazione indicata dal grafico è la relazione utilizzata per l'ereditazione di funzioni personalizzate aggiunte agli oggetti knockout. (Che ha senso, dato che era l'argomento della pagina della documentazione in cui è stato trovato)

Quindi se si definisce una funzione personalizzata su ko.subscribable.fn, allora sarà disponibile sia su calcolati che su osservabili ... ma se ne definite uno su ko.observable.fn sarà disponibile solo su osservabili (e matrici osservabili) non su computer, nonostante il fatto che ko.isObservable(computed) restituisca true.

+0

"Non è molto usato, ma è possibile costruire direttamente gli abbonati e passeranno il test ko.isSubscribable ma falliranno il test ko.isObservable, quindi la differenza tra questi due metodi." Questo era quello che stavo cercando, grazie! –

+0

Strano che lascino isObservable return true per i calcoli imo. Mi piace la separazione raffigurata nell'immagine meglio. E poi usa isSubscribable se vuoi solo sapere se puoi iscriverti al valore oppure no. –

+0

Sì, l'incongruenza è dispari. Anche se penso di preferire l'ereditarietà migliore di quella del grafico. Se si pensa a osservabili come "abbonati con valori", i calcoli * sono * osservabili; solo un tipo specifico, uno che dipende da altri osservabili. Hanno la stessa interfaccia di osservabili (tranne che possono essere di sola lettura). – Retsam

Problemi correlati