【问题标题】:Knockout JS Binding and Filter DataKnockout JS 绑定和过滤数据
【发布时间】:2014-02-25 08:23:24
【问题描述】:

我有以下问题

我有这段代码可以从外部 Web api 加载 Json 数据 并在我的网站上显示它是有效的..

但我的问题是 我必须使用下拉列表过滤数据

当我选择值“显示所有数据”时,我的所有数据都必须显示 当我在下拉列表中选择值“KV”时,只有数据 Object Arbeitsort 中的文本“KV”必须显示..

如何在我的代码中集成过滤器以通过下拉菜单过滤我的数据?

接下来是我如何在 HTML 中呈现按钮的每个项目上插入 显示此项目的详细信息 SHOWS his Detail Data ?

当我单击项目中的详细信息时,我必须打开一个框,并且在此框中我必须显示所有详细信息数据 这个特定的项目?

$(document).ready(function () {
function StellenangeboteViewModel() {
    var self = this;
    self.stellenangebote = ko.observableArray([]);
    self.Kat = ko.observable('KV');

    $.getJSON('http://api.domain.comn/api/Stellenangebot/', function (data) {
        ko.mapping.fromJS(data, {}, self.stellenangebote);
    });


}

ko.applyBindings(new StellenangeboteViewModel());
});

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    我会试一试,但这里有很多未知数。我的建议如下:

    首先,为您的结果创建一个computed 并绑定到它而不是self.stellenangebote

    self.stellenangeboteFiltered = ko.computed(function () {
        // Check the filter value - if no filter return all data
        if (self.Kat() == 'show all data') {
            return self.stellenangebote();
        }
        // otherwise we're filtering
        return ko.utils.arrayFilter(self.stellenangebote(), function (item) {
            // filter the data for values that contain the filter term
            return item.Arbeitsort() == self.Kat();
        });
    });
    

    关于详细链接,我假设您正在对self.stellenangeboteFiltered() 中的数据执行foreach,因此添加一列来保存链接以显示更多详细信息:

    <table style="width:300px">
        <thead>
            <tr>
                <th>Id</th>
                <th>Arbeitsort</th>
                <th>Details</th>
            </tr>
        </thead>
    
        <tbody data-bind="foreach: stellenangeboteFiltered">
            <tr>
                <td><span data-bind="text: Id"> </span></td>
                <td><span data-bind="text: Arbeitsort"> </span></td>
                <td><a href="#" data-bind="click: $parent.showDetail">Detail</a></td>
            </tr>
        </tbody>
    </table>
    

    添加控件以显示详细信息:

    <div data-bind="visible: detailVisible, with: selectedItem">
        <span data-bind="text: Position"> </span>
        <span data-bind="text: Arbeitsort"> </span>
    </div>
    

    在你的 JS 中添加一个函数:

    // add some observables to track visibility of detail control and selected item
    self.detailVisible = ko.observable(false);
    self.selectedItem = ko.observable();
    
    // function takes current row
    self.showDetail= function(item){
        self.detailVisible(true);
        self.selectedItem(item);
    };
    

    更新

    这是一个更新的小提琴:JSFiddle Demo

    【讨论】:

    • 嗨 Tanner 我无法回复答案...我在回答之前编辑了我的帖子.....
    • @user3350113 我已将计算更新为使用名为filter 的变量,过滤器现在在字符串中的任何位置搜索该术语。注意使用.toLowerCase 以避免大小写冲突。
    • 嗨 Tanner,有了新代码,我就没有数据了,也没有使用“显示所有数据”作为过滤关键字......当我删除 toLowerCase();然后在过滤器中使用“显示所有数据”关键字返回数据,但过滤器不适用于任何其他关键字......我可以通过电子邮件将链接发送到我的 Web api 你可以使用原始数据进行测试吗? ?
    • 您是否将此比较更改为小写:filter == 'show all data'
    • 是的,将“显示所有数据”设置为小写,我变成了所有数据......但是当我将过滤器设置为“kv”时,没有数据来......
    猜你喜欢
    • 2017-08-01
    • 2012-07-07
    • 2018-07-18
    • 2016-01-18
    • 2016-12-09
    • 2015-03-25
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多