0

WebサービスからJSONオブジェクトを再調整し、ノックアウト2.01を使用して結果を表示しています。問題なく結果を表示できますが、計算されたオブザーバブルをビューモデルに追加しようとすると、次のエラーが発生します。

以下のこのコードには何が欠けていますか?

Uncaught TypeError:オブジェクト#にはメソッド'dateCreated'がありません

!--- JSON

{"jobTitle":"Digital designer","dateCreated":"7/7/2012","timeCreated":"2:27    PM","location":"Perth","jobSummary":"one\ntwo\nthree","Uri":"/candidates/view-all-jobs/digital-designer/","CreateDate":"\/Date(1341635236000)\/"}

!-html

<div data-bind="foreach: $data">
 <article>
    <header>
      <time datetime="2007-08-29T13:58Z"></time>
      <h3><a target="_self" data-bind="text: $data.location"> </a> </h3>
    </header>
    <span data-bind="text: $data.fullDate">  </span> </article>
 </div> 

!-コード

var viewModel = ko.observableArray();

$(document).ready(function () {
    if ($('#featured-jobs').length > 0) {
        $.ajax({

            type: 'POST',

            url: "handler/jobServer.ashx",

            data: { 'jobType': '1' },

            success: OnComplete,

            error: OnFail,

            dataType: 'json'
        });
    }
});



function OnComplete(result) {

    var self = this;
    ko.mapping.fromJS(result, {}, viewModel);

    self.fullDate = ko.computed(
  function () {
     return self.dateCreated() + " " + self.timeCreated();
  }, self); 

    ko.applyBindings(new viewModel());

}

function OnFail(result) {

    alert('Request Failed');

}
4

1 に答える 1

1

これは、onCompleteが、プロパティselfを持たないという新しいオブジェクトを作成するためです。dateCreatedあなたが本当に望んでいるのは、その計算されたオブザーバブルをその中のすべてのアイテムに追加することだと思いますviewModel

編集:

オブザーバブルは素晴らしいですが、答えではない場合もあります(特に、「作成日」と「作成時間」の場合のように、値が変更される可能性が低い場合)。これが私がそれを行う方法です(観測量なしで)。観察不可能なプロパティにバインドすることもできます

function OnComplete(result) {

    for (var i = 0; i < result.length; i++)
    {
        result[i].fullDate = result[i].dateCreated + " " + result[i].timeCreated;
    }

    viewModel(result);
    ko.applyBindings(viewModel);
}

私が間違っていて、ユーザーがこれらの値を操作する場合は、次のように行うことができます(オブザーバブルを使用)。

function OnComplete(result) {

    ko.mapping.fromJS(result, {}, viewModel);

    for (var i = 0; i < viewModel.length; i++)
    {
        viewModel[i].fullDate = ko.computed(
            function () {
                return this.dateCreated() + " " + this.timeCreated();
            }, viewModel[i]); 
    }

    ko.applyBindings(viewModel);
}
于 2012-07-16T13:36:21.393 に答える