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" />