2017-09-15 1 views
0

Dans une table, j'ai une case à cocher liée à un bool dans un tableau observable.Mise à jour du texte à l'aide de la fonction calculée KO

Si l'une des cases du tableau est cochée/décochée, je souhaite mettre à jour le texte avec le total coché.

Je n'arrive pas à faire fonctionner la fonction calculée, j'ai essayé d'utiliser ko.utils.unwrapObservable à la fois sur le tableau et sur location.isSélectionné dans l'instruction 'if' ci-dessous, est-ce que je l'utilise au mauvais endroit?

<input type="checkbox" data-bind="checked: isSelected"/> 

<span class="text-left h5 ">Total Selected:</span><span data-bind="text: totalSelected" /> 


self.totalSelected = ko.computed(function() { 
    var selected = 0; 
    ko.utils.arrayForEach(self.SelectedLocations(), function (location) { 
     if (location.isSelected == true) { 
      selected = (+selected) + 1; 
     } 
    }); 
    return selected; 
}, self).extend({ notify: 'always' }); 

Répondre

0

L'un des problèmes est que isSelected est traité comme une variable calculée à l'intérieur du: location.isSelected == true. Cependant, si vous avez l'intention de lier une case, celle-ci doit être observable.

Alors, je l'ai déclaré une fonction pour créer les enfants de self.SelectedLocations comme:

var locationObservable = function() { 
    var self = this; 
    self.isSelected = ko.observable(false); 
}; 

Ensuite, vous pouvez changer le comptage dans la variable calculée comme suit:

if (loc.isSelected()) { 
    selected++; 
    } 

var locationObservable = function(selected) { 
 
    var self = this; 
 
    self.isSelected = ko.observable(selected); 
 
}; 
 

 
var model = function() { 
 
    var self = this; 
 

 
    self.SelectedLocations = ko.observableArray(); 
 
    self.SelectedLocations.push(new locationObservable(false)); // Set the state of the checkbox here. 
 
    self.SelectedLocations.push(new locationObservable(true)); 
 
    self.SelectedLocations.push(new locationObservable(false)); 
 

 
    self.totalSelected = ko.computed(function() { 
 
    var selected = 0; 
 
    ko.utils.arrayForEach(self.SelectedLocations(), function(loc) { 
 
     if (loc.isSelected()) { 
 
     selected++; 
 
     } 
 
    }); 
 
    return selected; 
 
    }, self); 
 
}; 
 

 
var vm = new model(); 
 
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> 
 

 
<div data-bind="foreach: SelectedLocations"> 
 
    <input type="checkbox" data-bind="checked: isSelected" /> 
 
</div> 
 

 

 
<span class="text-left h5 ">Total Selected:</span><span data-bind="text: totalSelected" />

+1

merci pour l'exemple, je vais le tester notre sous peu et voir ce qui se passe – DarkW1nter

+0

Je ne peux pas voir où self.isSelected obtient la valeur de selected à partir de la fonction – DarkW1nter

+0

Est-ce que vous posez des questions sur 'locationObservable'? Je viens de mettre à jour cela pour prendre un paramètre 'selected', qui est passé lors de l'ajout d'un nouvel élément à' SelectedLocations'. Quelque chose comme: 'self.SelectedLocations.push (new locationObservable (false));'. Cela a-t-il un sens maintenant? – Nisarg