web-dev-qa-db-fra.com

knockout js - vérifie si la propriété existe

J'essaye de rendre ce qui suit avec KO.

<!-- ko with: address-->
<!-- ko if: address1-->
<span style="display : block">
<span data-bind="varchar : address1"></span>
</span>
<span style="display : block">
<span data-bind="varchar : address2"></span>
</span>
<!-- /ko -->
<!-- /ko -->

Le problème est que même si l'objet adresse est présent, il peut ne pas contenir le paramètre address1 . J'aimerais que knockout ne rende pas les étendues imbriquées si le paramètre 'address1' est null . jeté:

Unable to parse bindings. Message: ReferenceError: address1 is not defined;

Toute aide très appréciée.

19
Chin

N'est-ce pas juste un cas de déplacer votre seconde si?

<!-- ko with: address -->
<span style="display : block">
<!-- ko if: address1 -->
<span data-bind="varchar : address1"></span>
<!-- /ko -->
</span>
<span style="display : block">
<span data-bind="varchar : address2"></span>
</span>
<!-- /ko -->

Il semble que nous ayons besoin de voir votre viewModel et de voir comment les adresses se rapportent les unes aux autres. Je peux le faire sur l'exemple de la page à masquer sans aucun problème:

<h1 data-bind="text: city"> </h1>
<p data-bind="with: coords">
    <!-- ko if: latitude -->
    Latitude: <span data-bind="text: latitude"> </span>,
    <!-- /ko -->
    Longitude: <span data-bind="text: longitude"> </span>
</p>
8
veblock

Si vous utilisez <!-- ko if: $data.address1 -->, l'erreur ne sera pas annulée si address1 n'est pas défini. 

Si address1 est rempli par la suite, la mise à jour de l'interface utilisateur ne sera toutefois pas mise à jour (address1 doit être un observable à l'origine).

90
RP Niemeyer

J'ai eu un cas où j'ai eu un modèle d'adresse appelé de différents endroits.

Mon champ de données 'nom de pays' était parfois countryName et parfois countryDesc.

Je viens de changer le modèle en ceci:

 <div data-bind="text: $data.countryName || $data.countryDesc"></div>

Cela tire parti du fait que si vous utilisez $data, cela ne causera pas d'erreur (comme l'a souligné RP Niemeyer). 

6
Simon_Weaver

La cause de ce comportement pourrait être les données initiales de votre "adresse" observable.

Si vous initialisez votre viewmodel de cette façon:

this.address = ko.observableArray();

alors "adresse" et "adresse1" ne sont pas définis.

Une solution de contournement consisterait à vérifier les données au début du bloc en enveloppant le code dans une instruction "ko if", de la manière suivante:

<!-- ko if: $data --> <br/>
<br/>
<span style="display : block"><br/>
<span data-bind="varchar : address1"></span><br/>
</span><br/>
<span style="display : block"><br/>
<span data-bind="varchar : address2"></span><br/>
</span><br/>
<br/>
<!-- /ko -->
0
ron.camaron