0

ノックアウト VM 内で、日時をプロパティに挿入しようとしています。関数は正しい日付を生成しますが、UI でレンダリングすると、1969 年 12 月 31 日午後 7 時の日付になります。このアイテムはシリアル化されておらず、オンザフライで生成されています。これが生成される理由と修正方法を誰かが理解するのを手伝ってくれますか? これがphpコードのどこに表示されるかについての記事をたくさん見ましたが、ノックアウトに固有のものはありません. dateTimePicker を参照する SO に関する 1 つの記事がありましたが、OP の問題または私の問題との類似性はすぐにはわかりませんでした。

私のjsファイル内

function returnDateFormat() {

    var d = new Date();

    date = d.getDate();
    date = date < 10 ? "0" + date : date;

    mon = d.getMonth() + 1;
    mon = mon < 10 ? "0" + mon : mon;

    year = d.getFullYear();

    hours = d.getHours();

    min = d.getMinutes();

    sec = d.getSeconds();

    return (mon + "/" + date + "/" + year + " " + hours + ":" + min + ":" + sec);
}

成功時の ajax 呼び出しで関数が参照される場所。基本的に、イベントが発生した日付を表示するように VM を更新しようとしています。これは、ページの初期化時にロードされ、UI にバインドされるため、次のロード時に正しい値が DB から取得されて入力されることがわかります。必要がなければ、日付セット全体を呼び出しから戻したくありませんでした。

$.ajax({
       type: "POST",
       url: "warehouse/" + command,
       data: "{ productId:'" + product.ProductId() + "', newname: '" + newname + "' }",
       contentType: "application/json; charset=utf-8",
       dataType: "json",
       success: function (msg) {
       if (msg.Key == true) {
         DisplaySuccess("Update Complete.", "The product has been successfully updated.");
          //update product name in VM
          product.Name(newname);
          product.DateLastModified(returnDateFormat());
        }
        else {
        //Display error message if ajax msg fails
          DisplayError("Error Renaming Product ", msg.Value);
        }

       }, error: function (err) {
        DisplayError("Error Renaming Product", "The server returned an error code. Code: " + err.status);
     }
   });

次にcshtmlファイルで、日付を変更した要素をdiv要素にバインドします

 <div title="Product Last Modified" class="productDetailItem scalableText productModified" data-bind="text: FormatDate(DateLastModified())"></div>

更新: さらに調査すると、元の日付が Json のシリアル化された文字列として渡されています。これは、cshtml 関数が FormatDate アドレスを呼び出すものです。Json 文字列を解析してフォーマットします。マッピングのこの部分を書いていなかったので、その時はこれに気づきませんでした。

それが壊れていた理由は、関数が期待するJsonのシリアル化された文字列ではなく、フォーマットされた日時を渡したからです。これを修正するために、クライアント側で日時を生成してからシリアル化し、それを関数に渡すことで問題を修正する予定です。すぐに実用的なソリューションを投稿します。他の提案を歓迎します。-乾杯

4

1 に答える 1

1

代わりにこれをやりたいだけだと思います:

<div title="Product Last Modified" class="productDetailItem scalableText productModified" data-bind="text: DateLastModified"></div>

DateLastModified は既にフォーマットされているのに、再度フォーマットする必要はありません。補足として、 moment.jsを調べることを強くお勧めします。「returnDateFormat」関数全体を次のように置き換えることができます。

product.DateLastModified(moment().format("MM/DD/YYYY hh:mm:ss a"));
// "09/05/2013 11:22:40 am"
于 2013-09-05T18:22:15.753 に答える