2016-11-24 3 views
0

J'ai un ensemble de cases à cocher et une case à cocher Sélectionner tout implémentée de la manière suivante en utilisant Knockout. J'ai besoin de la case "Sélectionner tout" à cocher par défaut lors du chargement de la page.Cochez la case "Sélectionner tout" en utilisant Knockout

$(document).ready(function(){ 
    viewModel=new model(ko,$); 
    ko.applyBindings(viewModel); 
}); 

function model(ko,$){ 
    var jsonResponse= $.parseJSON(response); 

    this.factors=ko.observableArray(jsonResponse["factors"]); 
    this.selectedFactors=ko.observableArray(); 

    this.selectAll = ko.dependentObservable({ 
     read: function() { 
      return this.selectedFactors().length === this.factors().length; 
     }, 
     write: function(newValue) { 
      this.selectedFactors(this.selectedFactors().length === this.factors().length ? [] : this.factors().slice(0)); 
     }, 
     owner: this 
    }); 

}

HTML:

<table> 
    <tr> 
     <td><input type="checkbox" id="selectAll" data-bind="checked: selectAll" />Select All</td> 
    </tr> 
</table> 
<table data-bind="foreach: factorsSplitJsonArray"> 
    <tr data-bind="foreach: $data"> 
     <td> 
      <!-- ko if: $data.hasOwnProperty("factorCode") --> 
      <input type="checkbox" class="jqFactors" id="jqFactors" data-bind="checkedValue: $data, checked: $root.selectedFactors" /> 
      <span data-bind="text: factorDescription"></span> 
      <!-- /ko --> 
     </td> 
    </tr> 
</table> 

Quand je sélectionner ou désélectionner une case à cocher ou la case SelectAll la observableArray-à-dire selectedFactors sont changés. Maintenant j'ai besoin de la case à cocher "Sélectionner tout" pour être sélectionné par défaut lors du chargement de la page et les éléments sélectionnés doivent également contenir tous les facteurs sélectionnés. Je suis nouveau à Knockout et incapable de découvrir comment implémenter cela en utilisant Knockout. Que faire si nous appelons en quelque sorte la fonction selectAll explicitement, fera-t-elle le travail? Comment appeler une fonction ko.dependentObservable. Quelqu'un peut-il m'aider s'il vous plaît.

Répondre

0

est ici une approche quelque peu différente pour arriver à la même chose:

var jsonData = { 
 
    allFactors: [ 
 
    { code: "A1", desc: "Alpha one" }, 
 
    { code: "A2", desc: "Alpha two" }, 
 
    { code: "B1", desc: "Beta one" }, 
 
    ], 
 
    
 
    // Simulate that no selection was ever made 
 
    selectedFactors: null // or "undefined" 
 
    
 
    // Unomment this version instead if you want to simulate loading 
 
    // data that was previously selected: 
 
    //selectedFactors: ["A1", "B1"] 
 
}; 
 

 
function ViewModel(data){ 
 
    var self = this; 
 
    
 
    self.factors = ko.observableArray(data.allFactors); 
 
    
 
    function getAllCodes() { 
 
    return data.allFactors.map(function(f) { return f.code; }); 
 
    } 
 
    
 
    self.selectedFactors = ko.observableArray(
 
    data.selectedFactors || getAllCodes() 
 
); 
 
    
 
    self.selectAll = ko.computed({ 
 
    read: function() { 
 
     return self.selectedFactors().length === self.factors().length; 
 
    }, 
 
    write: function(newVal) { 
 
     if (newVal === self.selectAll()) return;  
 
     if (!!newVal) self.selectedFactors(getAllCodes()); 
 
     if (!newVal) self.selectedFactors([]); 
 
    } 
 
    }); 
 
} 
 

 
ko.applyBindings(new ViewModel(jsonData));
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<label><input type="checkbox" data-bind="checked: selectAll"> Select All</label> 
 
<hr> 
 
<ul data-bind="foreach: factors"> 
 
    <li> 
 
    <label> 
 
     <input type="checkbox" data-bind="checkedValue: code, checked: $root.selectedFactors"> 
 
     <span data-bind="text: desc"></span> 
 
    </label> 
 
    </li> 
 
</ul>

+0

Merci pour votre aide mais je nai pas été en mesure de vraiment comprendre cela et mettre en œuvre. Est-ce que la case "Sélectionner tout" est cochée au chargement de la page? – Arunabh

+0

Si "Sélectionner tout" doit être sélectionné au chargement de la page dépend probablement de toutes les données en cours de chargement, en supposant que votre page peut conserver un côté serveur d'état. Si l'utilisateur a précédemment tout sélectionné, alors jsonData.selectedFactors va contenir tous les codes et la case "Select All" sera également vérifiée. – Jeroen

+0

Ce que je comprends de votre commentaire est que tous les facteurs du JSON sont attribués à "selectedFactors" afin qu'il coche "Sélectionner tout" au chargement de la page. Je l'avais déjà essayé et il vérifie "tout sélectionner" et tous les autres facteurs mais son comportement n'est pas exactement correct. Si je désélectionne une case à cocher, elle conserve toujours la case Tout sélectionner cochée. Dans l'idéal, elle doit décocher la case «Sélectionner tout» et cliquer à nouveau sur cette case pour sélectionner la case non cochée. – Arunabh