0

これは本当にニッチなシナリオです。理想的には、プロパティにバインディングを持つことができなければなりませんが、ビューモデル。ノックアウトのforeach/descendantバインディングのどこに観測可能なルートモデルがあるのか​​を知る

<div> 
<!-- ko foreach: groups --> 
    <input data-bind="value: name, custom-binding: { property: name, other: foo }" /> 
<!-- /ko --> 
</div> 

は、今、私が解決できるようにする必要があります:私はこのようなバインディングを持っているとしたら

{ 
    id: ko.observable(1), 
    name: ko.observable("some user"), 
    groups: [ 
     { id: ko.observable(1), name: ko.observable("some group") }, 
     { id: ko.observable(2), name: ko.observable("some group") }, 
    ] 
} 

今ここでの問題は次のとおりです。ですから、例えば

は、私がオブジェクトを持って言うことができますnameここではnameとは対照的にrootModel.groups[currentIndex].nameになります。現在私はバインディングの中でプロパティが"name"であることを知る方法はないと思うので、これを文字列として渡すか、オブジェクトにカスタム属性をバインディングする必要があるかもしれません探す。どちらの方法でも、バインディングのスコープ内で、observable(スコープ内に適用されたrootModelに関連して)のプロパティパスをどうにか取得できる必要があります。

私はそれが狂っていると知っていますが、それは可能な限り私ができることができなければならないことです。したがってforeachは、子バインディングスコープが変更され、すべてのシナリオでラップされるシナリオの1つに過ぎません。このカスタムバインディングで使用されるプロパティに対してproperty-pathを構築する必要があります。

これを行う方法はありますか?

+0

方法を見て気軽にその質問は、ko.contextFor(element)ヘルパーがあなたの目標に近づけることができますか?そしてあなたが言ったように、 '財産'は間違いなく文字列でなければなりません。 –

+0

Hey 'contextFor(element)'は、バインディング内で取得するのと同じ種類のコンテキストしか提供しないので、すべてのオブジェクト値であり、プロパティ名や何か(ほとんどの場合はプロパティ名は必要ありません)ではありません。 – Grofit

答えて

0

これを行うのは簡単ではないようですが、特定のバインディングのプリプロセッサを記述してスコープをキャッシュし、実行時に新しいバインドとして適用する必要がありました(プリプロセッサはバインディングコンテキストにアクセスできません)。

次に、実際のバインディングではプロキシされており、既存のスコープのある親があればルックアップし、バインディングコンテキストで子ルックアップのためにローカルプロパティを追加してキャッシュします。

これはで使用されている:

https://github.com/grofit/treacherous

だから私は完全には理解していないのが行われ、よりよい解決策がある場合は私に知らせてください:)

関連する問題