Knockout.js 敲除中的实时表搜索(在keyup上调用函数)
对不起,我是一个新的击倒我只是想做一个表上的实时搜索,但我似乎不能让我的模型的功能在搜索框的关键事件激发。这是小提琴 这是代码Knockout.js 敲除中的实时表搜索(在keyup上调用函数),knockout.js,Knockout.js,对不起,我是一个新的击倒我只是想做一个表上的实时搜索,但我似乎不能让我的模型的功能在搜索框的关键事件激发。这是小提琴 这是代码 <div class="container"> <table class="table table-condensed table-hover"> <thead> <tr> <th>First Name</th>
<div class="container">
<table class="table table-condensed table-hover">
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Department</th>
</tr>
</thead>
<tbody data-bind='foreach: employees'>
<tr>
<td data-bind='text: firstName'></td>
<td data-bind='text: lastName'></td>
<td data-bind='text: department'></td>
</tr>
</tbody>
</table>
<h2 class="text-center">Search</h2>
<div class="form">
<div class="form-group">
<label>first name:</label>
<input type="search" class="form-control" data-bind="value: query valueUpdate: 'keyup' event: { keyup: search }" autocomplete="off" />
</div>
</div>
</div>
我建议使用observable数组的强大功能来显示/隐藏搜索结果,而不是跟踪列表中哪些项目在您的
employee
函数/对象中可见/隐藏。实现这一点的一种方法是通过computed
observable,如下所示:
self.filteredEmployees = ko.computed(function () {
var filter = self.query().toLowerCase();
if (!filter) {
return self.employees();
} else {
return ko.utils.arrayFilter(self.employees(), function (item) {
return item.firstName().toLowerCase().indexOf(filter) !== -1;
});
}
});
每当更新computed
内部的任何可见内容时,就会重新评估computed
本身。因此,在您的情况下,这有效地将订阅置于您的搜索文本框值上(query
在视图模型中可见)
另一个变化是您的标记现在需要foreach
绑定到filteredEmployees
computed
而不是实际的employees
可观察数组
计算机内部的逻辑执行以下操作:
检查搜索输入文本框中是否键入了任何内容(query
observable)。如果不是,则整个员工
可观察数组将从计算
返回,并绑定到foreach
绑定
如果在搜索输入文本框中键入了内容,则使用名为arrayFilter
的内部敲除帮助函数循环遍历employees
observable数组中的每个项目。每次迭代都使用员工的名字(firstName
observable)与该名字的小写版本与输入到搜索输入文本框中的文本的小写版本进行比较(query
observable)。嵌套的return
语法一开始可能看起来有点奇怪,但是内部的return
填充了可观察数组,外部的return
用作计算的
可观察的返回值。过滤后返回的可观察数组可能是一切、零或介于两者之间的东西,但它没有触及实际的员工
可观察数组;一个新的/不同的对象从computed
observable返回
注意-computed
observable中的过滤器
变量捕获用户键入内容的小写值。这样就无需在每次循环迭代时强制搜索输入文本框值为小写(节省时间和资源)
最后一个标记更改是,更新后的JSFIDLE不再使用值
绑定和更新值
绑定,而是使用较新的文本输入
绑定。对于更新版本的敲除(3+),这是推荐的方法。它更高效,并且支持复制/粘贴/剪切到文本框中,值
绑定和更新值
绑定很难做到这一点
以下是textInput
绑定的标记更改:
<input type="search" class="form-control"
data-bind="textInput: query" autocomplete="off" />
应该是这样的:
<input type="search" class="form-control"
data-bind="value: query, valueUpdate: 'keyup', event: { keyup: search }"
autocomplete="off" />
注意-我已经更新了您的我建议使用可观察数组的功能来显示/隐藏搜索结果,而不是跟踪列表中哪些项目在您的员工
功能/对象中可见/隐藏。实现这一点的一种方法是通过computed
observable,如下所示:
self.filteredEmployees = ko.computed(function () {
var filter = self.query().toLowerCase();
if (!filter) {
return self.employees();
} else {
return ko.utils.arrayFilter(self.employees(), function (item) {
return item.firstName().toLowerCase().indexOf(filter) !== -1;
});
}
});
每当更新computed
内部的任何可见内容时,就会重新评估computed
本身。因此,在您的情况下,这有效地将订阅置于您的搜索文本框值上(query
在视图模型中可见)
另一个变化是您的标记现在需要foreach
绑定到filteredEmployees
computed
而不是实际的employees
可观察数组
计算机内部的逻辑执行以下操作:
检查搜索输入文本框中是否键入了任何内容(query
observable)。如果不是,则整个员工
可观察数组将从计算
返回,并绑定到foreach
绑定
如果在搜索输入文本框中键入了内容,则使用名为arrayFilter
的内部敲除帮助函数循环遍历employees
observable数组中的每个项目。每次迭代都使用员工的名字(firstName
observable)与该名字的小写版本与输入到搜索输入文本框中的文本的小写版本进行比较(query
observable)。嵌套的return
语法一开始可能看起来有点奇怪,但是内部的return
填充了可观察数组,外部的return
用作计算的
可观察的返回值。过滤后返回的可观察数组可能是一切、零或介于两者之间的东西,但它没有触及实际的员工
可观察数组;一个新的/不同的对象从computed
observable返回
注意-computed
observable中的过滤器
变量捕获用户键入内容的小写值。这样就无需在每次循环迭代时强制搜索输入文本框值为小写(节省时间和资源)
最后一个标记更改是,更新后的JSFIDLE不再使用值
绑定和更新值
绑定,而是使用较新的文本输入
绑定。对于更新版本的敲除(3+),这是推荐的方法。效率更高
<input type="search" class="form-control"
data-bind="value: query, valueUpdate: 'keyup', event: { keyup: search }"
autocomplete="off" />