質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

解決済

1回答

892閲覧

Monacaバックエンドでコレクションアイテムを検索してデータを更新したい

hitomi_

総合スコア10

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

0クリップ

投稿2020/02/26 06:30

編集2020/03/05 09:27

いくつかあるフォームから「登録」ボタンを押したときに、ローカルストレージとMonacaバックエンドにデータを保存したいのですが、Monacaバックエンドへの登録ができません。

html

1<form data-role="none" id="account" method="post" action="#"> 2 <table data-role="none" class="your_form_table" id="your-form-table"> 3 <tr data-role="none" class="your_form_tr"> 4 <th data-role="none" class="your_form_left"> 5 <label data-role="none" for="service_name"> 6 サービス名 7 </label> 8 </th> 9 <td data-role="none" class="your_form_right"> 10 <input data-role="none" type="text" name="service_name_0" id="service_name_0" class="your_input_text"> 11 </td> 12 </tr> 13 <tr data-role="none" class="your_form_tr"> 14 <th data-role="none" class="your_form_left"> 15 <label data-role="none" for="service_id"> 16 ログインID 17 </label> 18 </th> 19 <td data-role="none" class="your_form_right"> 20 <input data-role="none" type="text" name="service_id_0" id="service_id_0" class="your_input_text"> 21 </td> 22 </tr> 23 <tr data-role="none" class="your_form_tr"> 24 <th data-role="none" class="your_form_left"> 25 <label data-role="none" for="service_pass"> 26 パスワード 27 </label> 28 </th> 29 <td data-role="none" class="your_form_right"> 30 <input data-role="none" type="text" name="service_pass_0" id="service_pass_0" class="your_input_text"> 31 </td> 32 </tr> 33 </table> 34 <input data-role="none" class="btn-flat-double-border-tsuika" id="account_0" type="button" onClick="Add(this);" value="登録する"> 35</form>

javascript

1//ローカルストレージに保存する 2function Add(account_no) { 3 //フォームナンバーを変数に入れる 4 var idNo = account_no.id;//これだと「submit_0」 5 idNo = idNo.replace(/[^0-9]/g, '');//数字を取り出す 6 7 //ローカルストレージに保存する 8 var serviceName = document.getElementById('service_name_' + idNo).value; 9 var serviceId = document.getElementById('service_id_' + idNo).value; 10 var servicePass = document.getElementById('service_pass_' + idNo).value; 11 12 localStorage.setItem('service_name_' + idNo, serviceName); 13 localStorage.setItem('service_id_' + idNo, serviceId); 14 localStore.setItem('service_pass_' + idNo, servicePass); 15 //ここまではOK 16 17 //オンラインストレージに保存 18 var account = monaca.cloud.Collection("Account"); 19 var idno 20 var service_name 21 var service_id 22 var service_pass 23 24 console.log(idNo); 25 26 account.findOneMine('idno == idNo', "idno DESC") 27 .done(function(item) 28 { 29 console.log(idno); 30 item.service_name = serviceName; 31 item.service_id = serviceId; 32 item.service_pass = servicePass; 33 item.update() 34 .done(function(result) 35 { 36 console.log('Updating success'); 37 }) 38 .fail(function(err) 39 { 40 console.log("Err#" + err.code +": " + err.message); 41 }); 42 }); 43}

console.log(idNo);
ではフォームのID「0」が出力されますが、account.findOneMine('idno == idNo', "idno DESC")の後の
console.log(idno);
は「undefined」となっています。

また、その後は
TypeError: null is not an object (evaluating 'item.service_name = serviceName')
というエラーが出てしまいます。
item.service_name = serviceName;をservice_name = serviceName;に書き換えたところ、
TypeError: null is not an object (evaluating 'item.update')
というエラーが出ます。

リファレンスを見ながら書いているのですが、うまくいきません。
どこを直したらいいのか、教えていただけると幸いです。

-追記-

javascript

1function Add(account_no) { 2 //フォームナンバーを変数に入れる 3 var idNo = account_no.id;//これだと「submit_0」 4 idNo = idNo.replace(/[^0-9]/g, '');//数字を取り出す 5 6 //ローカルストレージに保存する 7 var serviceName = document.getElementById('service_name_' + idNo).value; 8 var serviceId = document.getElementById('service_id_' + idNo).value; 9 var servicePass = document.getElementById('service_pass_' + idNo).value; 10 11 localStorage.setItem('service_name_' + idNo, serviceName); 12 localStorage.setItem('service_id_' + idNo, serviceId); 13 localStorage.setItem('service_pass_' + idNo, servicePass); 14 15 //オンラインストレージに登録 16 var account = monaca.cloud.Collection("Account"); 17 console.log(idNo); 18 account.findOne() 19 .done(function(item) 20 { 21 item.service_name = serviceName; 22 item.service_id = serviceId; 23 item.service_pass = servicePass; 24 item.update() 25 .done(function(result) 26 { 27 console.log('Updating success'); 28 }) 29 .fail(function(err) 30 { 31 console.log("Err#" + err.code +": " + err.message); 32 }); 33}); 34 }

このコードではエラーも出ずデータを更新できるのですが、findOne()の中に'idno == idNo', "idno DESC"を入れるとやはり下記のエラーが出てしまいます。
TypeError: null is not an object (evaluating 'item.service_name = serviceName')
コレクションの検索がうまくいっていないみたいです。
どなたか原因などわかりましたら教えてください。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決できました。

javascript

1 //ローカルストレージに保存する 2 function Add(account_no) { 3 //フォームナンバーを変数に入れる 4 var idNo = account_no.id;//これだと「submit_0」 5 idNo = idNo.replace(/[^0-9]/g, '');//数字を取り出す 6 7 //ローカルストレージに保存する 8 var serviceName = document.getElementById('service_name_' + idNo).value; 9 var serviceId = document.getElementById('service_id_' + idNo).value; 10 var servicePass = document.getElementById('service_pass_' + idNo).value; 11 12 localStorage.setItem('service_name_' + idNo, serviceName); 13 localStorage.setItem('service_id_' + idNo, serviceId); 14 localStorage.setItem('service_pass_' + idNo, servicePass); 15 16 //オンラインストレージに登録 17 var account = monaca.cloud.Collection("Account"); 18 console.log(idNo); 19 20 account.findOneMine(monaca.cloud.Criteria("idno==?", [idNo]), {propertyNames: ["idno", "service_name", "service_id", "service_pass"]}) 21 .done(function(item) 22 { 23 if(item != null){ 24 item.service_name = serviceName; 25 item.service_id = serviceId; 26 item.service_pass = servicePass; 27 item.update() 28 .done(function(result) 29 { 30 console.log('Updating success'); 31 }) 32 .fail(function(err) 33 { 34 console.log("Err#" + err.code +": " + err.message); 35 }); 36 } else { 37 account.insert({ idno: idNo, service_name: serviceName, service_id: serviceId, service_pass: servicePass}) 38 .done(function(insertedItem) 39 { 40 console.log('Insert is success!'); 41 }) 42 .fail(function(err){ 43 console.log('Insert failed!'); 44 }) 45 } 46}) 47 .fail(function(err) 48 { 49 50 });

1.idnoの検索のために使う変数は"[]"で囲まなければ変数扱いされていなかった
2.すでにデータがあるアイテムは更新、ない場合は挿入のところをifで分岐させる際、当初idnoがnullかどうかで分岐させていた(item.idno != null)のを、(item != null)にしたところ条件分岐ができた

投稿2020/03/08 20:15

hitomi_

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問