我有一个具有以下配置的ng-grid:
vm.gridOptions = {
data: 'vm.users',
showFilter: true,
columnDefs: [
{ field: 'firstName' },
{ field: 'lastName' },
{ field: 'email' }
]
};
使用Breeze查询的结果填充vm.users
属性:
var query = breeze.EntityQuery.from('Users')
.where('firstName', 'startsWith', 'K');
return manager
.executeQuery(query)
.then(querySucceeded, _queryFailed);
这基本上有效。它以我期望的方式显示在网格中,但是当我尝试过滤时,无论我键入什么,一切都被过滤掉了。我能够在ng-grid中跟踪这段代码:
var searchEntireRow = function(condition, item, fieldMap){
var result;
for (var prop in item) {
if (item.hasOwnProperty(prop)) { // <-- Works if I get rid of this condition
var c = fieldMap[prop.toLowerCase()];
if (!c) {
continue;
}
...
问题是当ng-grid搜索实体(item
)时,item
中存在必要的字段,但它们未通过hasOwnProperty
检查。如果我摆脱了这个检查,它甚至可能是安全的,因为它仍然会检查以确保prop
中存在fieldMap
......但我仍然犹豫是否做出这样的改变。
如果我进行投影而不是实体查询,它可以正常工作,但我不想丢失实体查询所获得的缓存(我想我可以进行实体查询,然后进行投影查询反对缓存...)。有没有更好的方法让breeze实体在ng-grid中可过滤,或者这是一个错误?
我使用的是ng-grid 2.0.11和angular 1.2.15。
答案 0 :(得分:1)
如果您的模型库是“backingStore”(就像Angular应用程序一样),那么您的实体属性都不是“自己的”属性。它们都在实体类型构造函数的原型上实现为ES5属性。
如果确实想要限制您的过滤器看到对象的直接数据属性(不是继承的数据属性),您可以这样写:
var proto = Object.getPrototypeOf(obj);
for (var key in obj) {if (obj.hasOwnProperty(key)) /* your logic here */;}
了解这会选择一些Breeze属性,例如entityAspect
,如果模型中有任何实体继承,则不会检测“基类”的属性。
现在您知道原因,您可以决定如何继续。
请注意,每个Breeze实体类型都有圆形。至少x.entityAspect.entity
点回x
。这对于某些第三方控件来说是一个问题;我不知道ng-Grid是否存在问题。