2017-12-28 10 views
0

関数呼び出しの結果に基づいて条件付きで要素にクラスを追加しようとしていますが、Aureliaはパラメータが変更されたときに関数を再実行しません。通常、私は汚れチェックを強制するためにゲッターを使用しますが、私の関数は不可能な引数を必要とします。Aurelia強制ゲッターを使用しないダーティチェック

問題の関数は次のようになります。

isVisible (item, filters) { 
    // If there are no filters selected, or at least one of the item's tag names are inside the filters the item is considered visible 
    return (!filters.length || (filters.length && item.tags.some(tag => { 
     return filters.indexOf(tag.name) !== -1 ? true : false; 
    }))); 
} 

そして場合には、それはそれはitemと文字列の配列(filters)を取り、その後、item.tags[].nameのいずれかがfiltersの配列内にあるかどうかを確認する明白ではありません。それはそうのように私の見解で使用されている

<item repeat.for="item of items" item.bind="item" class="${isVisible(item, filters) ? 'show' : 'hide'}"></item> 

私も、ちょうど私が再計算物事にオーレリアを強制すると仮定ビューに直接コードを追加することなく、機能の全体を追加するときに試してみました(${code here}の内部の)ビューにコードがあります。予期しない構文解析エラー>が表示されます。

+0

これを見てみましょうfunction/ –

答えて

2

上記の例では、filtersが変更されたときに再評価されます。しかし、filtersを突然変異させた場合、パフォーマンス上の理由からアレイ観察が自動的ではないため、Aureliaは変更を受け取ることができません。あなたはfiltersの不変のインスタンスを使用することによってこの問題を回避またはそれに加えて、以下のようなfilters長さを観察することができます:http://www.sobell.net/aurelia-dirty-checking-a-:

<item repeat.for="item of items" 
    item.bind="item" 
    class="${isVisible(item, filters, filters.length) ? 'show' : 'hide'></item> 
+0

ニースは、単に 'filters.length'を渡してトリックを行いました!私はそれがちょっとしたハックのように感じるにもかかわらず、なぜ、理解します... – powerbuoy

+0

実際には、 'filters'配列は実際に私のVM内で利用できるので、私の見解から渡すことは厳密には必要ではありません。 'item'を渡すだけで同じ結果が得られる方法はありますか? 'isVisible(item)'?デコレータや、VMの 'isVisible'メソッドで使用できるものはありますか? – powerbuoy

+1

あなたが興味を持っているのはメソッドの観察ですが、現在サポートされていません。私はあなたができることは、信号を使うことと、 'filters'を変更するたびに再評価するために' repeat'バインディングを送ることです。 – bigopon

関連する問題