2016-04-07 6 views
1

いくつかのケースで使用する汎用フィルタバリューコンバータを作成しようとしています。私は値を取得するsettings.where式を解析する必要がありますするつもりだ知っているAurelia Value Converter、式を解析してサブプロパティをフィルタリングする

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

:私はこのようなサブオブジェクトのプロパティによって配列内の項目ことができ、フィルタになりたいです。これまでのところ、私は一緒に次の石畳います

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は私に表現を与えるように見えますが、パーサは、コアフレームワーク外で使用するように設計されたのですか? evaluateにはスコープが必要ですが、そのうちの1つはありません...私は式ツリーを歩いて自分自身で結果を得ることができますが、このようなものは既に存在しますか?

答えて

0

私は最終的に私が非常に近いフレームワークのソースを見る機会を得ました。以下のコードは動作するようです。スコープは単に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); 
    } 
} 
1

これはaurelia blog post about value convertersから切り取られる:

enter image description here

多分これはこのことを念頭に置いて、あなただけの引用符なしであなたの例を使用することができるはずです、あなたを助けます:

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

+0

この例では、単一のサブプロパティ値を値コンバータに渡す方法を示しています。私はパス内を渡そうとしているのですが、配列内の各項目について評価され、それぞれをフィルタリングするのに使用されます。 – Tim

+0

達成したいことをもう少し説明し、評価されたいと思っているこのパターンをどのように見せることができますか? – kabaehr

+0

私は、この回答のようなフィルタ値コンバータを持っています:http://stackoverflow.com/a/29163491/106623。これは 'item [property]'を使って比較する各項目の値を取得します。これは 'item.settings.where'にアクセスするための有効なJavaScriptではないので、サブプロパティ' item ['settings.where'] 'では機能しません。 aureliaのParserはすでに 'settings.where'を式に解析できますが、スコープなしで評価することはできません。 – Tim

関連する問題