这个问题是通过深入研究原始问题而产生的:如何根据表行数据在表下拉列表中设置过滤器 https://stackoverflow.com/questions/25381772/how-to-set-filter-in-table-dropdown-based-on-table-row-data
背景
我想在 SAPUI5 下拉控件上使用过滤器,我在其中根据模型属性(数据绑定)设置过滤器值
问题
如果我使用过滤器,其中过滤器值value1
指定为数据绑定:
new sap.ui.model.Filter({
path : "division",
operator : sap.ui.model.FilterOperator.EQ,
value1 : "{/someProperty}"
})
那么下拉列表不会呈现任何项目
然而,如果我hardcode财产价值value1
:
new sap.ui.model.Filter({
path : "division",
operator : sap.ui.model.FilterOperator.EQ,
value1 : "Test"
})
然后过滤器将按预期工作。
问题
我们是否不能使用数据绑定来指定过滤器值?或者我应该以另一种方式实现它?
我的一小部分人实际上可以理解,使用同一模型中的值在控件的模型上设置过滤器可能会引起一些引用问题,但是当使用两个不同的命名模型(一个用于下拉列表,一个用于过滤值)
任何帮助是极大的赞赏!
我刚刚浏览了 ClientListBinding 的代码,不幸的是不支持 Filter 值的属性绑定。请检查源代码here https://openui5.hana.ondemand.com/resources/sap/ui/model/ClientListBinding-dbg.js.
查看功能获取过滤函数,过滤器值是从您的过滤器定义中获取的oValue1 and oValue2,它不会解析任何 DataBinding 路径以从 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;
};
我想你必须在这里解决方法才能使用事件处理程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)