无法使用数据绑定设置过滤器值? [英] Not possible to set Filter value using data binding?
问题描述
这个问题来自深入研究原始问题:如何根据表格行数据在表格下拉列表中设置过滤器
This issue came forth from drilling down the original question: How to set filter in table dropdown based on table row data
背景
我想在SAPUI5下拉控件上使用过滤器,我根据模型属性设置过滤器值(数据绑定)
I want to use a filter on a SAPUI5 dropdown control, where I set the filter value based on a model property (data binding)
问题
如果我使用的过滤器值 value1
是由数据绑定指定:
If I use a filter where the filter value value1
is specified by data binding:
new sap.ui.model.Filter({
path : "division",
operator : sap.ui.model.FilterOperator.EQ,
value1 : "{/someProperty}"
})
然后下拉列表不会呈现任何项目
then the dropdown does not render any items
但是,如果我硬编码属性值 value1
:
new sap.ui.model.Filter({
path : "division",
operator : sap.ui.model.FilterOperator.EQ,
value1 : "Test"
})
然后过滤器按预期工作。
Then the filter works as expected.
问题
我们不能使用数据绑定来指定过滤器值吗?或者我应该以另一种方式实现它?
Is it true we can't use data binding for specifying a filter value? Or should I implement it in another way?
我的一小部分实际上可以理解,使用同一模型中的值设置控件模型的过滤器可能会引发一些参考问题,但这种行为当使用两个不同的命名模型时也会出现(一个用于下拉列表,一个用于过滤器值)
非常感谢任何帮助!
推荐答案
我刚刚浏览了ClientListBinding的代码,遗憾的是不支持Filter值的属性绑定。请查看源代码此处。
I just went through the code of ClientListBinding, unfortunately the property binding for Filter value is not supported. Please check the source code here.
查看函数 getFilterFunction ,过滤器值是从您的过滤器定义 oValue1 和 oValue2 得到的,它不会解析从DataModel获取值的任何DataBinding路径。
See function getFilterFunction, the filter value is get from your Filter definition oValue1 and oValue2, it does not parse any DataBinding path to get value from DataModel.
/**
* Provides a JS filter function for the given filter
* @name sap.ui.model.ClientListBinding#getFilterFunction
* @function
*/
ClientListBinding.prototype.getFilterFunction = function(oFilter){
if (oFilter.fnTest) {
return oFilter.fnTest;
}
var oValue1 = this.normalizeFilterValue(oFilter.oValue1),
oValue2 = this.normalizeFilterValue(oFilter.oValue2);
switch (oFilter.sOperator) {
case "EQ":
oFilter.fnTest = function(value) { return value == oValue1; }; break;
case "NE":
oFilter.fnTest = function(value) { return value != oValue1; }; break;
case "LT":
oFilter.fnTest = function(value) { return value < oValue1; }; break;
case "LE":
oFilter.fnTest = function(value) { return value <= oValue1; }; break;
case "GT":
oFilter.fnTest = function(value) { return value > oValue1; }; break;
case "GE":
oFilter.fnTest = function(value) { return value >= oValue1; }; break;
case "BT":
oFilter.fnTest = function(value) { return (value >= oValue1) && (value <= oValue2); }; break;
case "Contains":
oFilter.fnTest = function(value) {
if (typeof value != "string") {
throw new Error("Only \"String\" values are supported for the FilterOperator: \"Contains\".");
}
return value.indexOf(oValue1) != -1;
};
break;
case "StartsWith":
oFilter.fnTest = function(value) {
if (typeof value != "string") {
throw new Error("Only \"String\" values are supported for the FilterOperator: \"StartsWith\".");
}
return value.indexOf(oValue1) == 0;
};
break;
case "EndsWith":
oFilter.fnTest = function(value) {
if (typeof value != "string") {
throw new Error("Only \"String\" values are supported for the FilterOperator: \"EndsWith\".");
}
var iPos = value.lastIndexOf(oValue1);
if (iPos == -1){
return false;
}
return iPos == value.length - new String(oFilter.oValue1).length;
};
break;
default:
oFilter.fnTest = function(value) { return true; };
}
return oFilter.fnTest;
};
我想你必须在这里解决方法使用事件处理程序。
I guess you have to go workaround here to use event handler.
这篇关于无法使用数据绑定设置过滤器值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!