2013-04-14 15 views
7

Ho un elenco a discesa di categorie che controlla un elenco a discesa di sottocategoria. Voglio nascondere l'elenco a discesa delle sottocategorie se l'array della sottocategoria è vuoto per la categoria selezionata.knockout js 'con' binding, hide se array è vuoto

codice di esempio riportato di seguito:

<script> 

    self.categories = ko.observableArray([ 
      {"name": "top 1", "subcategories":[ 
               {"name": "sub 1"}, 
               {"name": "sub 2"} 
               ]}, 
      {"name": "top 2", "subcategories":[]} 
    ]); 

    self.selected_category = ko.observable(); 
    self.selected_sub_category = ko.obserable(); 

</script> 

<div> 
    <select data-bind="options: categories, optionsText: "name", optionsCaption: "Select", value: selected_category"></select> 
</div> 
<div data-bind="with:selected_category"> 
    <select data-bind="options: subcategories, optionsText: "name", optionsCaption: "Select", value: selected_sub_category"></select> 
</div> 

risposta

10

È necessario combinare il with vincolante con il if (o la visible) vincolante in cui è possibile specificare la sua condizione:

<div data-bind="with: selected_category"> 
    <!-- ko if: subcategories.length > 0 --> 
    <select data-bind="options: subcategories, optionsText: 'name', 
     optionsCaption: 'Select', value: $parent.selected_sub_category"></select> 
    <!-- /ko --> 
</div> 

Demo JSFiddle.

Nota l'utilizzo dello nello value: $parent.selected_sub_category, è necessario accedere all'oggetto "padre" perché lo with crea un contesto secondario.

Se non si desidera rendere l'intero div quando la raccolta sub è vuota allora avete bisogno di spostare il with e if fuori della vostra div perché KO non permette di utilizzare più associazioni di controllo del flusso sullo stesso elemento.

Quindi, in questo caso il vostro codice HTML sarebbe simile a questa:

<!-- ko with:selected_category --> 
    <!-- ko if: subcategories.length > 0 --> 
     <div class="mydiv">  
      <select data-bind="options: subcategories, optionsText: 'name', 
        optionsCaption: 'Select', 
        value: $parent.selected_sub_category"> 
      </select>  
     </div> 
    <!-- /ko --> 
<!-- /ko --> 

Demo JSFiddle.

+0

Grazie nemesv. C'è un modo per combinare il con e se in un attributo di data-bind. La ragione è che preferirei se il div non fosse reso affatto. –

+0

Non è possibile combinare 'if' e' with' nell'attributo data-bind. Se lo provi, visualizzerai il seguente messaggio di errore: "Più associazioni (con e se) stanno tentando di controllare i collegamenti discendenti dello stesso elemento. Non è possibile utilizzare questi binding insieme sullo stesso elemento." Ma li sposti "fuori" vedi la mia risposta aggiornata. – nemesv

Problemi correlati