0

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

これが私がやりたいことの例です(そしてドキュメントのようなものはうまくいくはずですが、うまくいきません):

<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直接に渡した場合(匿名オブジェクトのプロパティの値としてではなく)、依存メソッドは機能します。これは、何が機能するかだけでなく、私が避けようとしていることを示すjsfiddleです。

これは予想される動作ですか、それとも単純なものが欠けていますか?2012.01.322ビルドを使用しています。

私が何かを見逃していない場合、剣道UIでこれを機能させるためにできることはありますか(私はjs忍者ではないので、コードを編集することはおそらくオプションではないことに注意してください)?おそらく、この動作を実現するためのより良い方法がありますか?

この質問を信頼できるコミュニティに二重に投稿することで、より積極的な回答が得られることを願っています

4

1 に答える 1

1

私は回避策を見つけることになりました(それは機能しますが、それが本当に解決策であるとは思いません)。たぶん、JavaScriptの経験が豊富な人なら、それをクリーンアップする方法についての指針を提供できるでしょう。jsfiddle

問題は、を使用する必要があるときにundefined使用していたため、依存メソッドが戻ってきたことです。スコーピングの問題のようです。渡されるfieldName部分を処理するために、次のように関数オブジェクトへのパラメーターとして取り込みます。this.get("oldValue")this.get("phoneNumber.oldValue")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")    
})); 

私が言ったように、これは非常に汚いようですが、それは機能します。必要になったときに別のレベルのネストをどのように処理するかはまだよくわかりませんが、少なくとも問題が何であるかはわかっています。


TelerikのAtanasから、実際にはバグであるという確認を受け取りました。

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

私は次の公式リリースの一部となる修正を上陸させました。それまでは、見つけた回避策を使用できます。

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

よろしく、アタナスコルチェフテレリックチーム

うまくいけば、他の人がMVVMソリューションを採用し始めるまでに修正されるでしょう。

于 2012-04-04T14:46:20.793 に答える