2012-04-04 14 views
0

私は、古い値、新しい値、および現在の値フィールドで構成されるいくつかのフィールドセットを含むモデルを持つデータ監査Webアプリケーションに取り組んでいます。現在の値は、古い値または新しい値が現在の値に使用されるべきかどうかを決定するためにかなり些細なロジックを使用する計算フィールド(KO項による)です(基本的に新しい値がある場合は古い値を使用します)。これらのフィールドセットは全体のフォームに約20個含まれているため、個別にすべてkendo.bindに電話する必要はありません。ネストされたViewModel依存メソッドが動作しません

ここで私が行うことができるようにしたいものの例だ(およびドキュメントは、ソートの動作するはずと言うのではなく):

<div id="practiceSection"> 
    <div id="phoneNumber"> 
     <h4>Phone Number</h4> 
     <span>Display Value:</span> 
     <input id="displayPhoneNumber" data-bind="value: phoneNumber.DisplayValue"/><br/> 
     <span>Old Value:</span> 
     <input id="oldPhoneNumber" data-bind="value: phoneNumber.OldValue"/><br/> 
     <span>New Value:</span> 
     <input id="newPhoneNumber" data-bind="value: phoneNumber.NewValue"/><br/> 
    </div> 
</div>​ 

とJavaScript:

String.IsNullOrEmpty = function(value) { 
    var isNullOrEmpty = true; 
    if (value) { 
     if (typeof (value) == 'string') { 
      if (value.length > 0) 
       isNullOrEmpty = false; 
     } 
    } 
    return isNullOrEmpty; 
} 

function FieldBlock(oldValue, newValue) { 
    this.OldValue = oldValue; 
    this.NewValue = newValue; 

    this.DisplayValue = function() { 
     var newValue = this.get("NewValue"); 
     if (String.IsNullOrEmpty(newValue)) 
      return this.get("OldValue"); 

     return newValue; 
    }; 
} 

kendo.bind($("#practiceSection"), kendo.observable({ 
    phoneNumber: new FieldBlock("111-111-1111", null) 
})); 

jsfiddle

FieldBlock.DisplayValue一貫未定義復帰をもたらす上記のコード。奇妙なことに、FieldBlockオブジェクトをkendo.observableに直接(匿名オブジェクトのプロパティの値としてではなく)渡すと、従属メソッドが機能します。 Here is a jsfiddleは何が効いているのか、私が避けようとしていることを示しています。

これは予期された動作ですか、それとも簡単なものがありませんか?私は2012.01.322ビルドを使用しています。

もし私が何かが欠けていないなら、剣道UIでこの作業をするために何かできることはありますか?(私はjs忍者ではないので、コードを編集するのはおそらくオプションではありません)?おそらく、この動作を達成するためのより良い方法がありますか?

私は信頼してコミュニティにこの質問double postingで、私はより積極的な応答を得る可能性があることを期待して

答えて

1

私は(それが動作しますが、私はそれは本当に解決策だとは思わない)回避策を見つけてしまいました。たぶん、より多くのjavascriptの経験を持つ誰かがそれをきれいにする方法のポインターを提供することができます。 jsfiddle

問題は、私はthis.get("phoneNumber.oldValue")を使用している必要があるとき、私はthis.get("oldValue")を使用していたので、私の依存方法がundefinedを返したことがある表示されます。それはスコープの問題のようです。 getに渡されるフィールド名の部分を処理するために、私はそうのように私の関数オブジェクトにパラメータとしてそれを取る:私が言ったように

function FieldBlock(oldValue, newValue, fieldName) { 
    this.OldValue = oldValue; 
    this.NewValue = newValue; 

    this.DisplayValue = function() { 
     var newValue = this.get(fieldName + ".NewValue"); 
     if (String.IsNullOrEmpty(newValue)) 
      return this.get(fieldName + ".OldValue"); 

     return newValue; 
    }; 
} 

kendo.bind($("#practiceSection"), kendo.observable({ 
    phoneNumber: new FieldBlock("111-111-1111", null, "phoneNumber"), 
    faxNumber: new FieldBlock("999-999-9999", null, "faxNumber")  
})); 

、これは非常に汚れているようだが、それは作業を行います。私はそれが必要になったときに別のレベルのネストを処理する方法はまだ分かりませんが、少なくとも問題の内容を知っています。


Received confirmation TelerikのはAtanasから、それは実際にはバグであること:こんにちは

、明確化をありがとうございました。私はこれがバグであることを確認します。 ネストされたビューモデルがある場合、「this」コンテキストは間違っています。 の例では、 "this"は "phone"オブジェクトでなければなりませんが、 "viewModel"です。

次の正式リリースの一部になる修正が出ました。 まで、見つかった回避策を使用できます。

この問題をご報告いただきありがとうございます。

よろしく、 アタナスKorchev Telerikチーム

がうまくいけば、それは他の人が自分のMVVMソリューションを採用し始めた時間で固定されます。

関連する問題