Knockout des computed
oder pureComputed
würde den Trick tun.
Versuchen mit VM wie diese
function VM(data) {
var self = this;
//.............
self.filter = ko.observable(null);
self.data = ko.observableArray(data)
self.filteredData = ko.pureComputed(function(){
return self.data().filter(function(x){
return !self.filter() || x.status == self.filter();
})
});
self.setFilter = function(filter) {
self.filter(filter || null);
}
//.........................
}
und Markup wie diese
<ul data-bind="foreach:filteredData">
<li data-bind="text:$data.value">
</li>
</ul>
<a href="#" data-bind="click:setFilter(null)">all</a>
<a href="#" data-bind="click:setFilter('active')">active</a>
<a href="#" data-bind="click:setFilter('archived')">archived</a>
Diese kleine Testanwendung wie dieser
var someData = [
{status: 'active', value: 'some active'},
{status: 'active', value: 'another active'},
{status: 'archived', value: 'some archived'},
{status: 'archived', value: 'another archived'},
];
var vm = new VM(someData);
ko.applyBindings(vm);
vm.setFilter(null);
Hinweis initialisiert werden kann, dass, wenn Ihre Daten Array statisch (keine Änderungen während des Seitenlebenszyklus werden erwartet) Sie könnenweglassen 210 beobachtbare Array von der VM und verwenden Sie einfach data
statt
dup von https://stackoverflow.com/questions/47705453/knockout-foreach-with-awhere-klause? –