2016-11-04 8 views
0

任意のカスタム要素(またはビュー)の属性の変更を追跡したいと思います。だから、各ビューを更新するか、スーパークラスを作成するのではなく、プラグインを使用して、propertyChangedオブザーバにアタッチしようとしています。このように私はVMのコンテキストで、私はそれへの参照を持って、私は変更された属性と新しい値の名前があります。ビュー(要素)へのリンクも必要です。だから私の質問です - 私はどのようにビューを取得するVMを持っている場合は?ViewModelへの参照がある場合、Viewを取得する方法は?

は、より良い、私はまた私のテストコード(私のプラグイン)を貼り付け理解するために:

let originalCreateObserver = BindableProperty.prototype.createObserver; 

BindableProperty.prototype.createObserver = function(viewModel) 
{ 
    let changeHandlerName = this.changeHandler; 
    let name = this.name; 

    let behaviorPropertyObserver: BehaviorPropertyObserver = originalCreateObserver.apply(this, arguments); 
    let originalSelfSubscriber = behaviorPropertyObserver['selfSubscriber']; 

    behaviorPropertyObserver['selfSubscriber'] = function() 
    { 
     console.log('attr changed', viewModel, name); 
     // QUESTION: Link to a View? 

     originalSelfSubscriber.apply(this, arguments); 
    } 

    return behaviorPropertyObserver; 
} 

ボーナス質問:これはかなりのサルのパッチ適用です。加入者に接続するためのより良い方法はありますか?

答えて

1

ビューを与える要素をViewModelに挿入できます。例えば

@inject(Element) 
export class MyClass { 
    constructor(element) { 
     this.element = element; 
     //do something with element; 
    } 
} 
+0

私は「代わりに各ビューを更新、またはスーパークラスを作成するので、私はプラグインを使用しようとしている」と述べたようので、これは、良い答えではありません。要素の注入は、すべてのビューで行う必要があります。私はプラグインでView with VM(とそのコンテキスト)を接続する必要があります – user1440445

+0

あなたはもっと説明できますか?どのビューをプラグインで正確に使用する必要がありますか? – Benoit

+0

私は注入された要素が返すものを正確に欲しがっていますが、注入を行うことはできません。なぜなら、それは各Viewに対して一般的でなければならないからです。 – user1440445

関連する問題