0

編集:ここでのこの回答は解決策を提供したようです。私は怠惰な芝であり、モデルを2か所(サーバーで1回、クライアントで1回)で定義する必要がないように努めていたため、方法が必要だと考えました。リンクされたソリューションでカスタムバインディングを使用することで、さまざまなフォーム要素のデータバインド属性からオブザーバブルを作成できるため、基本的にはフォームからモデルを構築します。したがって、フォームからモデル定義を効果的に推進しています。これが悪い考えかどうかはまだ決めていません:)

私は自分が何を間違っているのか疑問に思っています(または、実際、私が何か間違ったことをしているのかどうか。一度に1つのレコードを編集するためのフォームを作成する必要があります。これには、いくつかの単純なテキスト/数値のプロパティがあります。

{ItemCode:ABCD,LotNumber:1234,ID:4885,MeasuredValue1:90}

私はそれを行うためにマッピングプラグインでkoを使用することにしました。私はkoにかなり慣れていません。とにかく、私は次のようなビューモデルになりました:

var LotModel = function() {
    var self = this;
    self.Update = function(itemcode,lotnumber) {
    var data = { ItemCode: itemcode, LotNumber: lotnumber }
//DoAjax is just a utility function and is working fine.
        DoAjax("POST", "LotHistory.aspx/GetLotHistory", data,
        function(msg) {
            ko.mapping.fromJS(msg.d, null, self);
            ko.applyBindings(self);
        },
        function(xhr, ajaxOptions, thrownError) {
            AjaxFailure(xhr, ajaxOptions, thrownError);
        }
        );
    }
}

そして後で私のコードで、

var lm = new LotModel();

そして最後に$(document).readyに

ko.applyBindings(lm);

ビューモデルに表示されている場合を除いて、これで機能します。データをロードするたびに、vmのUpdate関数でko.applyBindings(self)を再度呼び出す必要があります。その行をコメントアウトすると、バインドされません。これは、単一のオブジェクトのみをバインドしているためだと思います(つまり、ビューモデル自体はkoマッピングプラグインが機能した後のオブジェクトです)が、koについて読んだところはどこでも、「これを1回呼び出すだけでよい」と書かれているようです。 、 これまで。" ですから、私は本当に明白な何かを見逃していると感じずにはいられません。documentready関数でko.applyBindings(lm)をコメントアウトしても、document.readyでlm.Updateが自動的に呼び出されるため、違いはありませんが、ビューモデルでコメントアウトすると破損します。

だから私の質問は-私はこれを間違った方法でやっていますか?一度に1つのオブジェクトだけをタイプバインディングするのはやり過ぎですか?あまり気にならなくて、思い通りに動作しますが、それでもしつこいです...

4

1 に答える 1

1

回避できる場合は、バインディングを何度も再適用しないことが実際に最善です。問題は、そもそもビューモデルに観察可能なプロパティがないことです。への最初の呼び出しでko.mapping.fromJSこれを修正できます (または、オブザーバブルを手動で追加できます)。

ko.mapping.fromJS({
    ItemCode: '', LotNumber: 0, ID: 0, MeasuredValue1: 0
  }, null, self);

実際の例については、フィドルを参照してください: http://jsfiddle.net/antishok/qpwqH/1/

于 2013-01-24T20:33:27.903 に答える