【问题标题】:Change filter value dynamically for a kendo datasource?为剑道数据源动态更改过滤器值?
【发布时间】:2013-03-07 10:54:52
【问题描述】:

我希望能够通过函数动态更新过滤器值:

filter: [{
            "field": "id_person",
            "operator": "eq",
            "value": GetIdPerson()
       }]

以及功能:

function GetIdPerson() {
     try{
         if (viewModel.get("SelectedMember").id_person > 0) {
            return viewModel.get("SelectedMember").id_person;
         }
     } catch(ex) { }
     return 0;
 }

但是当我调用 datasource.read() 时该函数没有被调用。

有没有更好的方法来做到这一点?

或者如果这是最好的方法,我做错了什么?

谢谢!

【问题讨论】:

    标签: jquery filter grid kendo-ui datasource


    【解决方案1】:

    DataSource 中有一个用于设置(更新)过滤器的内置函数,请查看this。所以实际上我不知道你为什么需要这个功能。这样做会更容易:

    try{
        if (viewModel.get("SelectedMember").id_person > 0) {
            datasource.filter({
               "field": "id_person",
               "operator": "eq",
               "value": viewModel.get("SelectedMember").id_person
            });
        }
    } catch(ex) { }
    

    我的意思是,为原始 datasource 定义/应用一个新过滤器,哪个条件是您想要的条件。

    但是当然没有什么可以阻止您使用函数来获取过滤器的实际值,您可以这样做:

    function GetIdPerson() {
        try{
            if (viewModel.get("SelectedMember").id_person > 0) {
                return viewModel.get("SelectedMember").id_person;
            }
        } catch(ex) { }
        return 0;
    }
    var datasource = new kendo.data.DataSource({
        ...
        schema  : {
            model : {
                fields: {
                    ...
                }
            }
        },
        filter: {
            "field": "id_person",
            "operator": "eq",
            "value": GetIdPerson()
       }
    });
    

    和/或

    datasource.filter({
        "field":    "id_person",
        "operator": "eq",
        "value":    GetIdPerson()
    });
    

    这里有一个例子:http://jsfiddle.net/OnaBai/9gnsj/

    【讨论】:

    • 谢谢#OnaBai,效果很好!但我认为这引起了问题。一旦我重写了过滤器: $("#GridAddress").data("kendoGrid").dataSource.filter({ "field": "id_person", "operator": "eq", "value": GetIdPerson() } ) 网格工具栏上的 CREATE 按钮停止工作。知道为什么吗?
    • 找到了。我错过了 serverFiltering: true。再次感谢。
    【解决方案2】:

    如果您想根据超过字段值进行过滤,您可以使用“和”运算符,否则使用“或”运算符。

    现在我正在创建一个动态过滤器。

    var filter = { logic: "and", filters: [] };
                for(var index=0; index < totalPages; index++){
                  filter.filters.push({field: "name", operator: "eq", value: dynamic value here });
                }
    dataSource.filter(filter);
    

    【讨论】:

      【解决方案3】:

      这对我有用。没有在任何地方记录,但在 gridOptions.dataSource 对象中看到了 _filter 和 _sort 对象,嘿,它突然起作用了。

              $http.get(templateUrl).success(function(result) {
                  gridOptions.columns = result.columns;
                  if (result.filter) {
                      gridOptions.dataSource._filter = result.filter;
                      gridOptions.dataSource._sort = result.sort;
                  };
      

      【讨论】:

      • { "columns": [ { "field": "fieldOne", "title": "field One", "width": "200px" }, { "field": "fieldTwo", "title": "field 两个数值右对齐", "width": "200px", "attributes": { "style": "text-align:right;" }, "格式": "{0:0.00}" }, ], "过滤器": [ { "field": "fieldTwo", "operator": "gt", "value": 100 }, { "field" : "fieldOne", "operator": "eq" , "value": null } ], "sort": [ { "field": "fieldTwo", "dir": "desc"} ] }
      • 以上是要使用的 json 文件(使用 templateUrl '/app/example/view1.json' 指向它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多