如何在ng-grid中显示和过滤Breeze实体?

时间:2014-05-01 19:08:18

标签: javascript angularjs breeze ng-grid

我有一个具有以下配置的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。

1 个答案:

答案 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是否存在问题。