1

ノックアウト.jsの操作方法を学んでいて、誤解がありました。

UI:

<ul>
    <li>
        <p>
            Caption:<span data-bind="text: object1.Caption" />
        </p>
    </li>

    <li>
        <p>
            Manufacturer: <span data-bind="text: object1.Manufacturer" />
        </p>
    </li>
</ul>

JS:

var viewModel = {
          object1: ko.observable()
     }

 $(document).ready(function () {  
   ko.applyBindings(viewModel);
}
);

function getData ()
{
 var response = $.ajax({
        type: "GET",
        datatype: "json",
        url:// my URL,
        success: function (data) {

            var result = jQuery.parseJSON(data);
            viewModel = ko.mapping.fromJS(result);
            **//ko.applyBindings(viewModel);**

        }
    });
}

JSON データ:

{"object1":{
  "Caption": "Some caption",
  "Manufacturer": "Some manufacturer"
}
}

チュートリアルに従ったようですが、applyBindings(viewModel) を最初に 1 回だけ呼び出そうとすると、機能しません。しかし、 getData() 関数で毎回呼び出すと機能します。

なにが問題ですか?start でapplyBindingsを1 回だけ呼び出して動作させるにはどうすればよいですか?

ご協力いただきありがとうございます。

4

2 に答える 2

2

fromJS の update オーバーロードを使用する必要があり、それを viewModel に再割り当てする必要はありません。

success: function (data) {
    var result = jQuery.parseJSON(data);
    ko.mapping.fromJS(result, viewModel);
}

あなたの場合、 from JSON メソッドを使用して、呼び出しを jQuery に保存することもできます。

success: function (data) {
    ko.mapping.fromJSON(data, viewModel);
}

また、viewModel を最初に作成するときに、すべてのプロパティを初期化する必要があります。

var viewModel = {
    object1: ko.observable(
    {
        "Caption": ko.observable(''),
        "Manufacturer": ko.observable('')
    })
 }
于 2013-03-13T12:32:55.453 に答える
0

ko.mapping.fromJS は、呼び出すたびに新しいオブジェクト インスタンスを返します。そのため、サーバーから新しいデータを取得するたびに applyBindings を呼び出す必要があります。

applyBindings を 1 つだけにしたい場合は、通常の ViewModel を用意し、フェッチしたデータからそのプロパティを 1 つずつ更新するか、viewmodel で自己実装されたバッチ更新メソッドを使用する必要があります。

于 2013-03-13T12:29:55.973 に答える