1

ノックアウト.jsを拾い、PHP(より具体的にはLaravelフレームワーク)を使用してmysqlデータベースにデータを保存しようとしています。ここにajaxがあります:

$.ajax("save", {
  data: ko.toJSON(this), // turns the input into JSON I assume?
  type: "post",
  success: function() {
    alert("Success!");  // right now I'm alerting the data to troubleshoot
  }
});

そして、データをDBに保存する私の方法:

// I expect my ajax to send me data that is in json format
// I then decode the data to get an array which I can use to run my query
$data = json_decode(Input::json(), true);
return DB::table('content')->insert($data);

ただし、問題は、正確には、オブジェクト型のデータを受信して​​いるように見えることです (実行gettype()$datajson_decode()エラーも返しました) 。stdClass Object私のjavascript内で何が起こっていたのかをトラブルシューティングすると、データに警告が表示され、データはJSONであったため、機能しているはずです。

ただし、次のように機能しました:

$data = json_encode(Input::json(), true);
return DB::table('content')->insert(json_decode($data), true);

これは正常に機能し、データベースなどに保存されましたが、混乱しています。JSON の経験がないことをお許しください。

  • フロントエンドでデータを JSON にエンコードする
  • サーバーにデータを送信する
  • バックエンドでデータをデコードし、サーバーで処理できる形式 (この場合は配列) に変換します。
  • データの挿入

だから、私の最初の試みではうまくいかなかった$data = Input::json()のはオブジェクト型です。Json_decode は文字列を想定しているためエラーをスローしますが、JSON を想定しているため、ちょっと迷っています。

4

3 に答える 3

-1

ノックアウト ビュー モデルを json として送信しようとしている場合、ビュー モデルを直接 json に変換することはできません。その理由は、ビュー モデルのすべてのフィールドが実際には次のようなフィールドではないためです。

var viewmodel = {
    name: 'Bob',
    age: 23
};

代わりに、フィールドはノックアウト オブザーバブルです。

var viewmodel = {
    name: ko.observable('Bob'),
    age: ko.observable(23)
};

現在の値を取得するには、実際に各オブザーバブルを呼び出す必要があります。明らかに、これは面倒かもしれませんが、これを行うことができるマッピング プラグイン、Knockout マッピング プラグインがあります。

マッピングプラグインを使用すると、次のことが簡単にできます。

ko.mapping.toJSON(viewmodel)

そして、viewmodel を通常の js オブジェクトとして表す json 文字列を返します。

于 2013-04-14T14:53:36.260 に答える