Knockout.js 当可观测阵列上的过滤器更改时,更新视图

Knockout.js 当可观测阵列上的过滤器更改时,更新视图,knockout.js,Knockout.js,我只想显示可观察数组的子集arrayData 如果我能够对数据应用过滤器,则使用ko: <div class="image-list" data-bind="foreach: arrayData"> <!-- ko if: type == 0 --> viewing only objects with attribute type==0 仅查看属性类型==0的对象 但是,我不知道当我想更改过滤器时,如何触发更新视图,例如type==1 如果可能的话 附

我只想显示可观察数组的子集
arrayData
如果我能够对数据应用过滤器,则使用
ko:

<div class="image-list" data-bind="foreach: arrayData">
   <!-- ko if: type == 0 -->
    viewing only objects with attribute type==0

仅查看属性类型==0的对象
但是,我不知道当我想更改过滤器时,如何触发更新视图,例如
type==1

如果可能的话

附言:


目前,我使用foreach和数据的副本,在模型中清除end reset。但对于这种方法,我需要为模型中的每个过滤器提供一个可观察数组,并大量复制

将您比较的值
类型
存储在一个可观察数组中:

self.selectedType=ko.observable()

并在viewmodel函数中根据需要更新其内容

然后用它来比较:

<!-- ko if: type == selectedType() -->

如果可以使用下划线,还可以将其筛选直接应用于foreach绑定:

<div class="image-list" data-bind="foreach: _.filter(arrayData, function() { return type== $root.selectedType() })">

var evens=2;.filter([1,2,3,4,5,6],函数(num){returnnum%2==0;})

=>[2,4,6]


将与之比较的值
类型
存储在一个可观察值中:

self.selectedType=ko.observable()

并在viewmodel函数中根据需要更新其内容

然后用它来比较:

<!-- ko if: type == selectedType() -->

如果可以使用下划线,还可以将其筛选直接应用于foreach绑定:

<div class="image-list" data-bind="foreach: _.filter(arrayData, function() { return type== $root.selectedType() })">

var evens=2;.filter([1,2,3,4,5,6],函数(num){returnnum%2==0;})

=>[2,4,6]


将与之比较的值
类型
存储在一个可观察值中:

self.selectedType=ko.observable()

并在viewmodel函数中根据需要更新其内容

然后用它来比较:

<!-- ko if: type == selectedType() -->

如果可以使用下划线,还可以将其筛选直接应用于foreach绑定:

<div class="image-list" data-bind="foreach: _.filter(arrayData, function() { return type== $root.selectedType() })">

var evens=2;.filter([1,2,3,4,5,6],函数(num){returnnum%2==0;})

=>[2,4,6]


将与之比较的值
类型
存储在一个可观察值中:

self.selectedType=ko.observable()

并在viewmodel函数中根据需要更新其内容

然后用它来比较:

<!-- ko if: type == selectedType() -->

如果可以使用下划线,还可以将其筛选直接应用于foreach绑定:

<div class="image-list" data-bind="foreach: _.filter(arrayData, function() { return type== $root.selectedType() })">

var evens=2;.filter([1,2,3,4,5,6],函数(num){returnnum%2==0;})

=>[2,4,6]


我建议使用ko.utils.arrayFilter来获取要显示的项目。您需要添加一个observable来保存要筛选的值,然后在“arrayFilter”中使用它来更改要显示的项目

//ViewModel code below
var self = this;
self.selectedType = ko.observable(0); //starts at 0, when it changes it will kick off the 'filtered' computed.
self.filtered = ko.computed(function(){
  return ko.utils.arrayFilter(arrayData, function(item) {
        if (item.type() == self.selectedType()){
           return item;
        };
    });
})
这将返回“arrayData”中与“arrayFilter”中定义的条件匹配的项目列表。然后,您的foreach数据绑定将只绑定到此计算数据,而不是直接绑定到arrayData

<div class="image-list" data-bind="foreach: filtered">

你可以在这里阅读更多关于ko.utils函数的内容(还有很多其他的好东西!)

编辑:
感谢connexo指出问题的视图部分。在我最初的通读中完全忽略了这一点。

我建议使用ko.utils.arrayFilter来获取要显示的项目。您需要添加一个observable来保存要筛选的值,然后在“arrayFilter”中使用它来更改要显示的项目

//ViewModel code below
var self = this;
self.selectedType = ko.observable(0); //starts at 0, when it changes it will kick off the 'filtered' computed.
self.filtered = ko.computed(function(){
  return ko.utils.arrayFilter(arrayData, function(item) {
        if (item.type() == self.selectedType()){
           return item;
        };
    });
})
这将返回“arrayData”中与“arrayFilter”中定义的条件匹配的项目列表。然后,您的foreach数据绑定将只绑定到此计算数据,而不是直接绑定到arrayData

<div class="image-list" data-bind="foreach: filtered">

你可以在这里阅读更多关于ko.utils函数的内容(还有很多其他的好东西!)

编辑:
感谢connexo指出问题的视图部分。在我最初的通读中完全忽略了这一点。

我建议使用ko.utils.arrayFilter来获取要显示的项目。您需要添加一个observable来保存要筛选的值,然后在“arrayFilter”中使用它来更改要显示的项目

//ViewModel code below
var self = this;
self.selectedType = ko.observable(0); //starts at 0, when it changes it will kick off the 'filtered' computed.
self.filtered = ko.computed(function(){
  return ko.utils.arrayFilter(arrayData, function(item) {
        if (item.type() == self.selectedType()){
           return item;
        };
    });
})
这将返回“arrayData”中与“arrayFilter”中定义的条件匹配的项目列表。然后,您的foreach数据绑定将只绑定到此计算数据,而不是直接绑定到arrayData

<div class="image-list" data-bind="foreach: filtered">

你可以在这里阅读更多关于ko.utils函数的内容(还有很多其他的好东西!)

编辑:
感谢connexo指出问题的视图部分。在我最初的通读中完全忽略了这一点。

我建议使用ko.utils.arrayFilter来获取要显示的项目。您需要添加一个observable来保存要筛选的值,然后在“arrayFilter”中使用它来更改要显示的项目

//ViewModel code below
var self = this;
self.selectedType = ko.observable(0); //starts at 0, when it changes it will kick off the 'filtered' computed.
self.filtered = ko.computed(function(){
  return ko.utils.arrayFilter(arrayData, function(item) {
        if (item.type() == self.selectedType()){
           return item;
        };
    });
})
这将返回“arrayData”中与“arrayFilter”中定义的条件匹配的项目列表。然后,您的foreach数据绑定将只绑定到此计算数据,而不是直接绑定到arrayData

<div class="image-list" data-bind="foreach: filtered">

你可以在这里阅读更多关于ko.utils函数的内容(还有很多其他的好东西!)

编辑:
感谢connexo指出问题的视图部分。在我最初的通读中完全忽略了这一点。

我非常喜欢使用下划线,有时我没有意识到ko也有utils:)。尽管如此,要使这成为正确的答案,你仍然需要使用另一个可观察的对象来比较
类型
。是的,我听到了,哈哈。他们肯定很容易忘记,因为他们并没有真正记录在主要的淘汰网站上。感谢您指出我错过的需求,我将更新答案以包含可观察的。非常感谢您的答案和有价值的链接。无法停止阅读所有的文章…我太喜欢使用下划线了,有时我没有意识到ko也有UTIL: