🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

717閲覧

Vue.jsのwatch内でバインド変数を変化させた時、リクエストパラメータが変化していない

misskabu

総合スコア28

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/11/16 14:54

前提・実現したいこと

Vue.jsのwatch内で代入したdataをリクエストパラメーターに反映させたい。
4つのselectタグをwatchで監視して、それぞれ値が変化した時にsubmitしています。
この時、どのselectを変化させたのかを遷移先のコントローラーで取得するため、
hiddenタグにwatch内で識別文字列を代入して一緒にpostしたい。

発生している問題・エラーメッセージ

バインド自体は正常で、submitするまではvueのdataと画面のタグの値が連動 しているにも関わらず、送られたリクエストパラメータはwatch内で代入する前の値に なってしまっています。 何が間違っているかわかる方おられませんか?

該当のソースコード

javascript

1var input_form = new Vue({ 2 el:'#input_form', 3 data:{ 4 category_balance:'支出', //<select>タグとバインド 5 category_large:'', //<select>タグとバインド 6 category_middle:'', //<select>タグとバインド 7 category_small:'', //<select>タグとバインド 8 changed_form:'aaa' //<hidden>タグとバインド  9 }, 10 watch:{ 11 category_balance:{ 12 handler:function(newVal,oldVal){ 13//ここで値を代入すると、hiddenタグの値が'category_balance'に変化するが、 14//送られた値は代入前の'aaa'になる。 15 this.changed_form='category_balance'; 16 $(form).submit(); 17 } 18 }, 19 category_large:{ 20 handler:function(newVal,oldVal){ 21 changed_form='category_large'; 22 $(form).submit(); 23 } 24 }, 25 category_middle:{ 26 handler:function(newVal,oldVal){ 27 chaged_form='category_middle' 28 $(form).submit(); 29 } 30 }, 31 } 32})

html

1<!--抜粋--> 2<form action="input_book" method="post" id="form"> 3<input type="hidden" name="changed_form" v-model="changed_form">

試したこと

submit()を止めて、hiddenタグ、selectタグの値が正しくバインドされていることを確認した。

補足情報(FW/ツールのバージョンなど)

Lavel
Vue.js

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

憶測ですが

watch発火→submit→DOM更新
の順序になっているのではないでしょうか
Vue的に正しいかはわかりかねますが

setTimeout(function () { $(form).submit() },10)

みたいな感じで一旦Vueを抜けてDOM更新がされてそうなタイミングでsubmitしてみてはどうでしょうか

submit()を止めて

これは、デベロッパーコンソールでブレークポイントを貼って確認した方がその時のタイミングのDOMが確認できるのでより適切です

投稿2019/11/16 15:33

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

misskabu

2019/11/16 23:30

いただいたコードを使用したところ、無事に更新されたデータがポストされました。 ありがとうございました。 また、デベロッパーコンソールにブレークポイントを張れる事を知らず、今回やり方を調べて習得できました。その点もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問