2012-02-24 9 views
20

Sto riproducendo un blocco HTML simile per diversi oggetti leggermente diversi. Sono uguali al 90%, ma ognuno ha alcune peculiarità che richiedono osservabili aggiuntivi. Vorrei rendere ognuno di questi oggetti per lo più simili in un blocco di modello, ma sto incontrando problemi con oggetti non definiti.Knockout JS: verifica dell'esistenza di un osservabile in un binding IF

Fondamentalmente, voglio verificare l'esistenza di un oggetto osservabile prima di renderlo nel modello.

che sto cercando di fare qualcosa di simile:

<div data-bind="foreach: blocks"> 
<h2 data-bind="text: normalHeader"><h2> 
<p data-bind="text: normalText"></p> 
<!-- ko if: specialText --><p data-bind="text: specialText"></p><!-- /ko --> 
</div> 

Quindi, se specialText non esiste (e non solo non ha alcun valore, ma non esiste affatto) per quella iterazione del blocks, ignorare il condizionale. L'errore che sto ricevendo è:

Uncaught Error: Unable to parse bindings. 
Message: ReferenceError: specialText is not defined; 

Da quello che ho capito di Knockout di "se" vincolante, dovrebbe funzionare se l'oggetto restituisce alcun tipo di valore falso-come, come null o undefined, il che significa che il se l'associazione dovesse fallire con grazia, cosa che sicuramente non è.

C'è un modo per farlo funzionare?

risposta

45

È possibile utilizzare il seguente approccio:

<!-- ko foreach: Items --> 
    <strong data-bind="text: Foo"></strong> 
    <br /> 
    <!-- ko if: $data.hasOwnProperty("Bar") --> 
     <p data-bind="text: Bar"></p> 
    <!-- /ko --> 
<!-- /ko -->​ 

ho postato un working demo

+0

Questo funziona e sembra più elegante; Grazie! – Jack

+0

tuttavia, ovviamente non cambia se viene visualizzata la proprietà, in quanto non osservabile – mikus

+0

non fa ciò che la gente normalmente vorrebbe fare, "ovviamente"? bravo – pilavdzice

-1

provare questo:

<!-- ko if: specialText != null --> 

ko lo riconoscerà come un'espressione piuttosto che un valore e quindi dovrebbe lavoro come si vuole :)

10

<!-- ko if: typeof specialText != 'undefined' -->

Sulla base di soluzione di Oybek, si potrebbe anche fare:

<!-- ko foreach: Items --> 
    <strong data-bind="text: Foo"></strong> 
    <br /> 
    <!-- ko if: "Bar" in $data --> 
     <p data-bind="text: Bar"></p> 
    <!-- /ko --> 
<!-- /ko -->​ 

Esempio: http://jsfiddle.net/MecNx/56/

+1

Funziona anche, ma la funzione hasOwnProperty è un po 'più pulita; Grazie! – Jack

+0

Questa soluzione gestisce oggetti polimorfici, mentre hasOwnProperty() avrà esito negativo se la proprietà che stai cercando è stata aggiunta a un prototipo. L'esclusione delle proprietà del prototipo con hasOwnProperty() è preferibile quando si esegue una per ciascuna, ma in questo caso d'uso direi che è preferibile il controllo diretto per "non definito". – perilandmishap

1

Puoi farlo accedendo attraverso indicizzatore dell'oggetto:

<!-- ko foreach: Items --> 
 
    <strong data-bind="text: Foo"></strong> 
 
    <br /> 
 
    <!-- ko if: $data["Bar"] --> 
 
     <p data-bind="text: Bar"></p> 
 
    <!-- /ko --> 
 
<!-- /ko -->

Problemi correlati