这个问题来自于深入研究原始问题:How to set filter in table dropdown based on table row data
背景
我想在 SAPUI5 下拉控件上使用过滤器,我在其中根据模型属性(数据绑定(bind))设置过滤器值
问题
如果我使用过滤器,其中过滤器值 value1
由 data binding 指定:
new sap.ui.model.Filter({
path : "division",
operator : sap.ui.model.FilterOperator.EQ,
value1 : "{/someProperty}"
})
然后下拉列表不呈现任何项目
但是,如果我硬编码属性 value1
的值:
new sap.ui.model.Filter({
path : "division",
operator : sap.ui.model.FilterOperator.EQ,
value1 : "Test"
})
然后过滤器按预期工作。
问题
我们真的不能使用数据绑定(bind)来指定过滤器值吗?或者我应该以另一种方式实现它吗?
我的一小部分实际上可以理解,使用来自同一模型的值在控件的模型上设置过滤器可能会引发一些引用问题,但是当使用两个不同的命名模型(一个用于下拉列表,一个用于过滤值)
非常感谢任何帮助!
最佳答案
我刚刚浏览了 ClientListBinding 的代码,不幸的是不支持 Filter 值的属性绑定(bind)。请查看源码here .
参见函数getFilterFunction,过滤器值是从你的Filter定义oValue1和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;
};
我猜你必须在这里解决问题才能使用事件处理程序。
关于javascript - 无法使用数据绑定(bind)设置过滤器值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387580/