knockout.jsでjsonをQuery Stringに変換する際にハマった。
knockout.jsを使ってる前提でお話します。
例えば、こんなモデルがあるとして
function BlockSearchConditionModel(){ this.width = ko.observable(""); this.height = ko.observable(""); }
これをjQueryのajaxでGetのパラメータに含めたい場合、
$.ajax({ type: "Get", url: "/hoge/api/v1/blocks/search.json?widht=" + model.width() + "&height=" + model.height(), success: function(data){ // 成功時 } });
とする方法が考えられるが、
この方法だと条件が増えるたびにパラメータを書き換える必要がある。
なので、data: に$.paramを使いたい。
こっから本題です。
jsonにして渡すと
$.ajax({ type: "Get", url: "/hoge/api/v1/blocks/search.json", data: $.param(ko.toJSON(model)), success: function(data){ // 成功時 } });
0=%7B&1="&2=w&3=i&4=d&5=t&6=h&7="&8=・・・(略)
と、予想外のパラメータが生成されます。
なぜなら、ko.toJSONで生成されるjsonは
"{ "width": "10", "height": "20"}"
のように、外っ側に"が付いているのです。。
OH !!!
わざわざjsonにしないで、object渡しましょう。
$.ajax({ type: "Get", url: "/hoge/api/v1/blocks/search.json", data: $.param(model), success: function(data){ // 成功時 } });
というお話しです。
1時間近く考え込んでしまった・・。