AngularJs - ngRepeat 带有返回新对象的过滤器

2023-12-25

我正在尝试对过滤器中的对象应用转换,这会导致返回一组新对象。这是因为我想在应用转换后过滤对象并显示转换结果。然而,我最终得到了无限的摘要,因为我显示的对象与我放入的对象不同(当比较它们时)$$ids)。我解决这个问题的想法如下:

  1. 使用类似的跟踪表达式track by item.id并分配原始对象'ids到每个变换后的对象。虽然我所有的对象目前都有一个id,这似乎是一个坏主意,因为它使过滤器变得不太通用 - 原始对象必须有一个id,转换不得设置id(因为它将被覆盖)等等。

  2. 指定原始对象的$$id到变换后的对象。根据我的理解,这看起来很黑客$$id应该是只读的。

  3. 根据转换过滤的结果返回原始对象的子集。这可能会导致性能问题,因为需要在过滤器和显示表达式中应用转换,并且我必须循环遍历转换/过滤的项目以选择要返回的正确原始项目。

这是过滤器:

listModule.filter('ui.filter.transformFilter',
                 ['$filter',
                  '$id',
                   function($filter, $id)
  {
    var Filter = $filter('filter');
    return function(objects, transformer, expression) {
      // precondition- we need a list of objects
      if (!_.isArray(objects)) {
        return objects;
      }

      var transformed = [];
      for (var i = 0; i < objects.length; i++) {
        transformed[i] = transformer(objects[i]);
      }

      return filtered = Filter(transformed, expression);
    }                  
  }]
);

这是我尝试使用它的方式:

  <tr ng-repeat="item in list.items | ui.filter.transformFilter:list.transformerFunction:list.search" ng-click="list.select({'item': item})" class="list-item">
    <td ng-repeat="label in list.labels" ng-bind-html="item[label.key]"></td>
  </tr>

哦,理想情况下ngClick返回原始对象,但我总是可以在它周围包装一个函数来查找它。


解决此问题的一种方法是,您有一个幂等函数,由于对象 ID,Angular 认为该函数不是幂等的(因此会导致您提到的 $digest 循环问题):使用破折号/下划线_.memoize http://lodash.com/docs#memoize缓存函数的结果.

这将保证对于任何给定的缓存键,您的过滤器将始终返回完全相同的对象(包括$$id)。这样你就不用玩游戏了$$id你得到无需重新计算过滤结果的性能优势在每个 $digest 循环上。

以下是缓存过滤器结果的方法:

return _.memoize(function(objects, transformer, expression) { ... },
                 function(objects,transformer,expression){ 
                    return objects +transformer.name + expression;
                  });   

针对您的情况的一个重要说明是,默认情况下_.memoize使用第一个函数参数(objects在本例中)作为缓存键。由于给定不同的转换器函数和表达式,您的过滤器可能会产生不同的结果,因此我添加了可选的第二个参数 - 一个使用的哈希函数objects,expression,以及名称transformer函数来生成缓存键。

这是使用此代码的简化版本:fiddle http://jsfiddle.net/hK6tg/1/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJs - ngRepeat 带有返回新对象的过滤器 的相关文章

随机推荐

  • 如何使用 OpenCV 从图像中裁剪和提取图章?

    我是 OpenCV 新手 我有一个 简单 的邮票图像 我已经对其进行了一些处理 如下面的代码所示 现在我遇到了裁剪图像以获得印章的问题 边缘上的点和条纹会干扰我当前识别邮票的代码 图像可能不同 因此无法修复图像的位置 Code img cv
  • 循环算法Java实现

    我认为我的问题相当简单 但我觉得我需要一些不同的视角 因为我似乎无法将这个算法转化为代码 我需要制定一个运动队赛程表 其中 n 支球队 在本例中为 10 支球队 以循环赛形式进行比赛 规则遵循基本的循环赛格式 其中一支球队在给定时间只能与另
  • 基于 Woocommerce 中的自定义单选按钮的动态运费

    在 Woocommerce 中 我在结帐页面上添加了两个自定义单选按钮 单击后 我调用 ajax 函数来添加送货费 这是我的代码 document on change shipping method 0 local pickup5 func
  • 如何在 TBody 中将 TH 标头与 TD 对齐

    我在尝试使用一些 CSS 将表格嵌入现有 HTML 页面时遇到问题 默认情况下 此 CSS 隐藏表格的标题 其样式定义如下 tablestuff thead display none 但我希望显示表格 所以我尝试使用 display blo
  • Visual Studio 2017 安装中断:无法启动

    我使用管理员权限安装vs enterprise exe 但安装包根本不起作用 操作系统 win10专业版 appdata local temp 中的安装日志如下 dd bootstrapper 20170313103210 日志的开头 开始
  • Woocommerce:仅显示同一子类别的相关产品

    相关产品是从您的商店中提取与当前产品具有相同标签或类别的其他产品的部分 src Woocommerce 文档 http docs woothemes com document related products up sells and cr
  • Cordova 应用程序中的 HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)

    我使用 Cordova 3 2 和 jquery mobile 1 3 创建了一个 iOS 应用程序 我使用 jquery ajax 向 RESTfull 服务发送请求以检索 更新信息 我有很多测试设备 各种 iPhone 具有各种不同的
  • Xcode 11 中如果没有更多上下文,表达式类型不明确

    我想参考一个 Item 列出一个内 EnvironmentObject但是当在一个范围内访问它时SwiftUI List 我收到错误 我不明白的是 执行以下操作时不会弹出此错误Apple 的 Landmark 教程 https develo
  • MPRemoteCommandCenter 对 MPMusicPlayerController 不执行任何操作

    我一直在编写使用的代码 MPMusicPlayerController applicationMusicPlayer 演奏音乐 此操作已成功运行 并将在控制中心屏幕上显示当前播放曲目的详细信息 不幸的是 我似乎无法从控制中心屏幕或耳机中使用
  • Rails、jQuery、.js.erb 文件、JS 不被浏览器执行

    我正在尝试使用 jQuery 一切都很棒 直到现在 当我尝试渲染部分并将其附加到 div 时 这是我的设置方法 我有一个响应 js 的操作 def index objects Object find all respond to do fo
  • 如何使用 powershell 脚本在 CSV 文件顶部添加新行?

    我是 powershell 脚本编写的新手 我正在寻找一种方法在现有 csv 文件的顶部添加 2 个新行 我尝试过的事情是用新行替换标题和行 我正在寻找一种在 CSV 标题上方添加 2 个新行的方法 您提到您要添加新行above标头 这意味
  • Symfony $request->isXmlHttpRequest() 问题

    我需要检查请求是否是ajax request gt isXmlHttpRequest 工作正常 但是如果在执行过程中某个地方有重定向 此方法将返回 false 在这种情况下我还能如何检查请求是否是ajax 附注ajax是由jQuery发起的
  • 如何调用请求标头上需要不记名令牌的 NSwag 客户端方法?

    我没有确切了解 NSwag 如何与 IdentityServerX 不记名令牌交互并按常规添加请求标头 据我了解 我的主机 api 应用程序使用 LDAP 身份验证实现了 IdentityServer3 如果任何主机需要令牌进行身份验证 则
  • 在 R 中以日期为 X 轴绘图

    我以电子方式维护我的日记 我试图了解过去几个月我的日记写作的一致性 我有以下数据文件 显示有多少日记帐分录 Entry Count 和单词 Word Count 我记录了之前 30 天的时间 Date Entry Count Word Co
  • 在 Windows 上将 filesystem::path 转换为 char*

    The C 17 文件系统 https en cppreference com w cpp filesystem基于boost filesystem 我现在在 Windows 上使用 VS2017 include
  • sqlserver 中的 CONVERT 问题,出现 Msg 529 错误

    select CONVERT datetime value 103 from results 这个声明给了我一个错误 Msg 529 Level 16 State 2 Line 1 Explicit conversion from data
  • 如何检查进程是否属于当前用户?

    我正在尝试获取属于当前用户的进程的 PID 但我不知道如何检查进程所有者 这是我的代码 缺少用户的检查条件 uses TlHelp32 type TCardinalArray array of Cardinal function GetCu
  • 如何在tensorflow.js中获取/设置监督模型的权重?

    我想更改监督模型的权重 但更改权重后得到的结果完全相同 我究竟做错了什么 const model tf sequential model add tf layers dense model add tf layers dense model
  • 我想测试一个私有方法 - 我的设计有问题吗? [复制]

    这个问题在这里已经有答案了 因此 我对软件测试非常陌生 并且正在考虑向我的一个应用程序添加一些测试 我有一个公共方法 addKeywords 它一路上调用一个私有方法removeInvalidOperations 这个私有方法调用外部 AP
  • AngularJs - ngRepeat 带有返回新对象的过滤器

    我正在尝试对过滤器中的对象应用转换 这会导致返回一组新对象 这是因为我想在应用转换后过滤对象并显示转换结果 然而 我最终得到了无限的摘要 因为我显示的对象与我放入的对象不同 当比较它们时 ids 我解决这个问题的想法如下 使用类似的跟踪表达