[英]How to display and filter Breeze entities in ng-grid?
我有一个具有以下配置的ng-grid:
vm.gridOptions = {
data: 'vm.users',
showFilter: true,
columnDefs: [
{ field: 'firstName' },
{ field: 'lastName' },
{ field: 'email' }
]
};
vm.users
属性由Breeze查询的结果填充:
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
……但我fieldMap
进行此类更改。
如果我执行投影而不是实体查询,则可以正常工作,但是我不想丢失实体查询获得的缓存(我想我可以先进行实体查询,然后再对缓存进行投影查询。 )。 有没有更好的方法可以使微风实体在ng-grid中可过滤,还是这是一个错误?
我正在使用ng-grid 2.0.11和angular 1.2.15。
如果您的模型库是“ 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是否有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.