2017-07-06 12 views
1

Aureliaにカスタム要素を作成しましたが、valueChangedもありますが、valueがカスタム要素の外で変更された場合にのみ、特定の操作を行う必要があります。署名がvalueChanged(newValue, oldValue)なので、値がViewModelから変更され、カスタム要素自体から変更されるのをどのように知ることができますか?それはどういうわけかobserverまたはobservableとなっていますか?AureliaのvalueChanged起源を知るには?

私は実際に動作するサンプルを手に入れましたが、valueViewModelから変更されたときに__array_observer__というプロパティがあり、動作することがわかりましたが、それはおそらく理想的ではありません。だから私はちょっとしたコードを手に入れました

valueChanged(newValue, oldValue) { 
    if (newValue !== oldValue && newValue.__array_observer__) { 
    // value got changed outside of this custom element 
    } 
} 

これはおそらく理想的ではないでしょうか? valueがカスタム要素の外で変更された場所を知る上での他の提案はありますか?可能な限り

EDIT

、私はまだカスタム要素にアクセスする必要があります解決策を探しています。外部の値変更呼び出しによってトリガされたい場合でも、私は同じカスタム要素の内部関数を呼び出す必要があります。私の問題のもう少し説明を与えることを

EDIT#2

これはvalueを再影響するアクションをトリガーするので、私はvalueを外部から変更しまったときに知っておく必要があります。変更がカスタム要素の外側から来たのかどうかがわからなければ、私は再帰呼び出しを行い、それを止める方法はありません。私が探しているものはcallercalleeだったものと似ていますが、これはES5と厳密モードでは削除されましたが、これは非常に便利でした。

まだ答えを探し:(

答えて

1

ギッターで説明したように、あなたは

value: number; 
suppressValueChanged: boolean; 
valueChanged(){ 
    if(this.suppressValueChanged){ 
    this.suppressValueChanged = false; 
    this.logger.debug("the value has been changed from inside the element"); 
    return; 
    } 
    this.logger.debug("the value has been changed from outside the element"); 
    // here comes the code to run when the value is changed outside 
} 

internalSetValue(value: number){ 
    this.suppressValueChanged = true; 
    this.value = value; 
} 

抑止フラグを使用することができ、私はchanged方法でフラグをリセットした理由は、あなただけで行うことはできませんので、状況に応じて非同期アウレリアで呼び出すことができますvalueChangedということです時には

this.suppressValueChanged = true; 
    this.value = 123; 
    this.suppressValueChanged = false; 

を、次のタスクを使用して動作します

this.taskQueue.queueTask(() => { 
    this.suppressValueChanged = true; 
    this.value = 123; 
    this.suppressValueChanged = false; 
    }); 

本当にAureliaコードのどこが値を変更しているかによって異なります。私は最初のオプションが最も一貫した結果をもたらすことを発見しました。

+0

私は要素の外側から行われた変更だけを気にするので、私はロジックを逆転しようとしましたが、まだそれほど成功していません。 – ghiscoding

+0

なぜそれを反転する必要があるのか​​分かりません。内部から値を変更するときはいつも、 'internalSetValue'を呼び出してフラグをセットし、最終的に' return'の下の 'valueChanged'のコードをスキップします。 –

+0

私は使用法を暗示する答えを変更しました –

2

あなたはupdateTargetイベントをインターセプトするCustomBindingBehaviorを使用することができますたとえば、:。

export class InterceptBindingBehavior { 
    bind(binding, scope, interceptor) { 
    binding['originalUpdateTarget'] = binding['updateTarget']; 
    binding.updateTarget = val => { 
     alert('property was changed outside of the element'); 
     //do something here 
     binding['originalUpdateTarget'](val); 
    } 
    } 

    unbind(binding, scope) { 
    binding.updateTarget = binding['originalUpdateTarget']; 
    binding['originalUpdateTarget'] = null; 
    } 
} 

使用法:

<template> 
    <require from="./intercept-binding-behavior"></require> 

    <some-element value.bind="message & intercept"></some-element> 
</template> 

Runnableを例に: https://gist.run/?id=bcd7d39ed94856caf586f224f89fd1ff

私は多くの場合これをテストしていないし、最良の方法であるかどうかはわかりません。

updateSourceの代わりにupdateTargetを置き換えるだけで、反対の(代理人がVMの代わりに要素から変更されたときの代行受信)を行いたい場合は、

詳細情報についてCustomBindingBehaviorshttp://aurelia.io/hub.html#/doc/article/aurelia/binding/latest/binding-binding-behaviors/8

これが役に立てば幸い!

+0

ありがとう@Fabioこれはそれを行うのは面白い方法ですが、カスタム要素のコンテキストにいなければならないと私の質問で言及するのを忘れたかもしれません。あなたの傍受は完全にカスタム要素のコンテキスト外ですが、カスタム要素自体で直接関数を呼び出す必要があります。つまり、この値が外部的に私のカスタム要素にアクションを呼び出すときです。それは意味をなさないでしょうか? – ghiscoding

+0

基本的に私はカスタム要素内のすべてを行うことができますか、または私は本当に外部のバインディング動作が必要ですか? – ghiscoding

+1

私の答えはBindingBehaviorsにのみ当てはまると思います。しかし、カスタム要素で回避できる回避策があります。投稿と試してみよう –

関連する問題