【问题标题】:Referring to outer scope variables in orderBy inside ng-repeat在 ng-repeat 中按 orderBy 引用外部范围变量
【发布时间】:2015-12-09 19:31:19
【问题描述】:

我想要一个按某个外部查找表中的值排序的 ng-repeat。

例如,假设我有一个items 列表,其中每个项目都有一个itemType。我在范围中有一个单独的itemTypePriorities 查找表,这样itemTypePriorities[someItemType] 为给定的项目类型提供了优先级。现在,我想按优先级顺序显示项目。我正在尝试以下方法:

<div ng-repeat="item in items | orderBy:'itemTypePriorities[item.itemType]'>

但它似乎不起作用 - 我的猜测是它在 item 的上下文中解释 orderBy 表达式,即它试图通过无意义的表达式 item.itemTypePriorities[item.itemType] 进行排序。

有没有办法重写 ng-repeat 以使其正确运行,无需以任何方式修改 itemsitemTypePriorities 数组?

【问题讨论】:

    标签: angularjs angularjs-scope angularjs-ng-repeat angularjs-orderby


    【解决方案1】:

    您当然可以使用 orderBy 过滤器,但我认为您需要创建一个自定义函数来 orderit。

    例如:

    <div ng-repeat="item in items | orderBy:myFunction>
    

    myFunction 在控制器中的某处声明为:

    $scope.myFunction = function(el){
        //el is the current element under evaluation
    }
    

    并且应该返回一个值,该值将与 与另一个进行比较。在您的情况下,功能可以是:

    $scope.myFunction = function(el){
        return itemTypePriorities.indexOf(el);
    }
    

    应该可以的

    【讨论】:

    • 谢谢 - 我也找到了函数解决方案,但我正在尝试看看是否有办法避免它。 (在我的实际用例中,除了item优先级之外,我还需要再按一个字段排序,而函数方式对多字段排序效果不好)
    • 我认为函数的方式非常强大,因为你可以为每个元素评估很多东西,唯一的事情就是返回代表元素顺序的东西。在我看来,我认为函数解决方案更长,可能更复杂,但适用于各种情况,即使在最困难的情况下也是如此。
    • 假设你想对人(1)按姓名排序,(2)在同名的人中你想按银行账户余额对他们进行排序,以及(3)如果姓名和余额相同,按上面的“itemPriority”查找排序。您的排序功能会是什么样子?我不相信这样的功能甚至存在,特别是如果允许天平任意大且任意精确的话。请记住,orderBy 函数没有传递 2 个对象并要求比较它们,而是传递了 1 个对象并要求为其分配一个值。因此,当涉及到多字段时,功能方法是有限的。
    • 那么你应该传递一个函数数组,当一个标准相等时,它将进入下一个。在您的情况下,您也可以直接使用字符串,只需使用 ['name','balance','itemPriority'] (如果这些是字段的名称)它们将被评估为瀑布
    • 嗯,我在 orderBy 文档中没有注意到您可以传递函数数组。你是对的,函数方法似乎是这里的方法。尽管如此,不幸的是,Angular 没有办法在 orderBy 中引用“外部”变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2014-07-31
    • 2014-12-12
    • 2016-11-28
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多