【问题标题】:How to display and filter Breeze entities in ng-grid?如何在 ng-grid 中显示和过滤 Breeze 实体?
【发布时间】:2023-04-07 07:56:03
【问题描述】:

我有一个具有以下配置的 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... 但我不愿做出这样的改变。

如果我进行投影而不是实体查询,它可以正常工作,但我不想丢失通过实体查询获得的缓存(我想我可以先进行实体查询,然后再针对缓存...)。有没有更好的方法让微风实体在 ng-grid 中可过滤,或者这是一个错误?

我正在使用 ng-grid 2.0.11 和 angular 1.2.15。

【问题讨论】:

  • 我认为删除hasOwnProperty 检查是需要的。我知道您不想弄乱 ng-grid 代码,因为它会影响升级路径,但我不知道为什么首先要进行检查。
  • @SteveSchmitt,谢谢 - 我想我可能只需要走那条路

标签: javascript angularjs breeze ng-grid


【解决方案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。这对某些第 3 方控件来说是个问题;不知道是不是ng-Grid的问题。

【讨论】:

  • 感谢@Ward 的解释!
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多