【问题标题】:Aurelia Value Converter, filtering on sub-properties by parsing expressionAurelia 值转换器,通过解析表达式过滤子属性
【发布时间】:2016-04-07 14:00:44
【问题描述】:

我正在尝试创建一个通用过滤器值转换器以在少数情况下使用。我希望能够通过子对象的属性过滤数组中的项目,如下所示:

<li repeat.for="row of router.navigation | filter:'settings.where':'top'" >

我知道我将不得不解析 settings.where 表达式以获取值。到目前为止,我已经拼凑了以下内容:

import {inject, Parser} from 'aurelia-framework'

@inject(Parser)
export class FilterValueConverter {
  constructor(parser) {
    this.parser = parser;
  }

  toView(array, property, exp) {    
    let expression = this.parser.parse(property);
    return array.filter((item) => expression.evaluate(...?) === exp);
  }
}

parse 似乎给了我一个表达式,但 Parser 是否设计为在核心框架之外使用? evaluate 需要一个作用域,而我没有这些作用域……我可以遍历表达式树并自己获得结果,但是这样的东西是否已经存在?

【问题讨论】:

    标签: aurelia


    【解决方案1】:

    这是从aurelia blog post about value converters 中截取的:

    也许这对您有帮助,考虑到这一点,您应该能够在不带引号的情况下使用您的示例:

    <li repeat.for="row of router.navigation | filter:settings.where:'top'" >

    【讨论】:

    • 该示例显示了如何将单个子属性值传递给值转换器。我正在尝试传递一个路径,该路径可以对数组中的每个项目进行评估并用于过滤每个项目。
    • 您能否再解释一下您想要实现的目标以及您想要评估的路径是什么样的?
    • 我有一个过滤器值转换器,就像这个答案中的那个:stackoverflow.com/a/29163491/106623。它使用item[property] 来获取要比较的每个项目的值。这不适用于子属性 item['settings.where'],因为它不是有效的 JavaScript 来访问 item.settings.where。 aurelia 中的 Parser 已经可以将 settings.where 解析为表达式,但我无法在没有范围的情况下对其进行评估。
    • @Tim 如果你用. 分割你的字符串然后使用item[property[0]][property[1]] 之类的东西怎么办?这对你有用吗?
    • 我可以手动完成,但仍然会受到限制。如果我想使用settings[0].where 之类的东西作为路径怎么办?现有解析器的好处是它已经可以处理这个......
    【解决方案2】:

    我终于有机会查看我非常接近的框架源代码。下面的代码似乎工作。范围只需要一个bindingContext

    import {inject, Parser} from 'aurelia-framework'
    
    @inject(Parser)
    export class FilterValueConverter {
      constructor(parser) {
        this.parser = parser;
      }
    
      toView(array, property, exp) {    
        let expression = this.parser.parse(property);
        return array.filter((item) => expression.evaluate({bindingContext:item}) === exp);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多