2017-09-03 126 views
1

我想觀察綁定到自定義屬性的對象特定屬性的更改事件。我爲此使用bindable標籤。Aurelia:如何觀察綁定對象的特定屬性(自定義屬性)

目的

var information = { 
    name: 'foo', 
    description: 'bar', 
    age: 12 
}; 

元件

<div my="info: information;"></div> 

屬性

@customAttribute('my') 
export class MyCustomAttribute { 

    @bindable({ 
     changeHandler: 'change' 
    }) 
    public info: any; 

    private change(): void { 
     console.log('info has changed') 
    }  
} 

以上示例僅觸發該更改處理一次。但每當info對象上的其中一個屬性發生更改時,我都需要它進行觸發。在我的用例中,哪些屬性更改無關緊要,我只需要知道屬性何時更改。

任何想法如何?

FYI =>另一種方法是在視圖模型上創建一個單獨的屬性(並在其上使用可綁定標籤)而不是使用該對象,但我寧願不這樣做,因爲它會使屬性的管道乏味的HTML(因爲屬性的數量)。

+0

您可能正在尋找定製的觀察員(如https://ilikekillnerds.com/2015/10/observing-objects-and-arrays-in-aurelia/)。該鏈接有點過時了,但也許它會給你一些提示尋找什麼。 –

回答

1

我設法解決這個問題; (感謝馬克·沙伊布的評論)

import { BindingEngine, Disposable } from 'aurelia-framework'; 

@customAttribute('my') 
export class MyCustomAttribute { 

    @bindable public info: any; 

    private subscription: Disposable; 

    constructor(
     private binding_engine: BindingEngine 
    ) { } 

    public attached(): void { 
     this.subscription = this.binding_engine 
      .propertyObserver(this.info, 'name') 
      .subscribe(() => this.change()) 
    } 

    private change(): void { 
     console.log('info name property has changed') 
    }  

    public detached(): void { 
     this.subscription.dispose(); 
    } 
} 
0

據我所知,沒有辦法綁定到嵌套的屬性值,不幸的是。可觀察系統基於Aurelia可以重寫的屬性,以便在框架發生更改時通知它們。因爲您將更新嵌套屬性而不是info屬性本身,所以不會觸發通知。我認爲最好的辦法就是像你在「參與」中提到的那樣去做,然後創建一個單獨的財產,然後再觀察。

關於款式的說明。你可能已經意識到了這一點,但你實際上並不需要這個裝飾器@customAttribute('my')。這將是Aurelia會議系統的默認行爲,因此您可以將其保留,最終結果將保持不變。

+0

嘿謝謝你的回覆。我設法讓它工作,但! 'customAttribute'只是爲了我自己的完整! ;) –

+0

好啊!我看到,使用綁定引擎掛鉤到特定的嵌套屬性,很好的解決方案:) –