为剑道数据源动态更改过滤器值?

Posted

技术标签:

【中文标题】为剑道数据源动态更改过滤器值?【英文标题】: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() 时该函数没有被调用。

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

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

谢谢!

【问题讨论】:

【参考方案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' 指向它。

以上是关于为剑道数据源动态更改过滤器值?的主要内容,如果未能解决你的问题,请参考以下文章

剑道网格中的日期时间过滤器

剑道网格自定义过滤器

使用 setOptions 动态更改属性后剑道滑块的问题

重置剑道多过滤器复选框数据源以反映过滤后的数据

如何在剑道组合框中更改/设置值

刷新网格后剑道ui网格可分页大小发生变化