おじゃまぷよ系エンジニアメモ

アプリエンジニアからサーバーとインフラエンジニアに転身しました

knockout.jsでajaxでAPI叩いてモーダル表示分け

とあるqueryパラメーターによって表示するモーダルの内容を変えるのをどうしようかと考えた結果
jQueryajaxAPIを叩いて、受け取ったレスポンスをKnockout.jsを使ってデータバインディングする形に落ち着いた。 モーダルを1つふやすのに、api,js,htmlの3つのファイル修正加えないといけないけど、基本的にif文なり加えて増やせばいいだけなので
そんなに複雑にならないであろうと思っている。 表示、非表示をもう少しうまく切り替えたいけど…

<html>
<head>
    <script src="knockout-3.4.0.js"></script>
    <script type="javascript">
        $(document).ready(function () {
            var showModal = function (param) {
                //paramによってどのモーダルを表示するかや、必要なパラメーターを返すapiを叩く
                $.ajax({
                    url: "/api/modal",
                    type: "GET",
                    contentType: "application/x-www-form-urlencoded",
                    data: {modal: param},
                    success: function (response) {
                        ko.applyBindings(getViewModel(response));
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        //エラーの場合はモーダルのhtmlをすべて非表示にする
                        var viewModel = new function () {
                        };
                        viewModel.modalType = "";
                        ko.applyBindings(viewModel);
                    }
                });
            };
            //apiのレスポンスによって取得するviewModelを変える
            var getViewModel = function (jsonResponse) {
                var viewModel = new function () {
                };
                viewModel.modalType = jsonResponse['modal_type'];

                if (viewModel.modalType == "modal1") {
                    viewModel.name1 = jsonResponse['name1'];
                    viewModel.image1 = jsonResponse['image_url1'];
                    //Modalを表示
                    openModal('#modal1');
                }
                if (viewModel.modalType == "modal2") {
                    viewModel.name2 = jsonResponse['name2'];
                    viewModel.image2 = jsonResponse['image_url2'];
                    //Modalを表示
                    openModal('#modal2');
                }
                return viewModel;
            };
            //queryパラメータの値を抽出する
            var getQueryParam = function (key) {
                var query = window.location.search.substring(1);
                var vars = query.split("&");
                for (var i = 0; i < vars.length; i++) {
                    var pair = vars[i].split("=");
                    if (pair[0] == key) {
                        return pair[1];
                    }
                }
            };
            var modalParam = getQueryParam("modal");
            if (modalParam) {
                showModal(modalParam);
            }
            else {
                //クエリーにmodalがなければモーダルすべて非表示にする
                ko.applyBindings(function () {
                    this.modalType = "";
                });
            }
        });
    </script>
</head>
<body>
<!-- ko if: modalType == "modal1" -->
<div>
    <img data-bind="attr: {src:image1}">
    <p data-bind="html:name1"></p>
</div>
<!-- /ko -->
<!-- ko if: modalType == "modal2" -->
<div>
    <img data-bind="attr: {src:image2}">
    <p data-bind="html:name2"></p>
</div>
<!-- /ko -->
</body>
</html>

モーダルを実際に表示するjsとcssはかけてないけど許して