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

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

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

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Monaca

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

解決済

Javascript localstorageを用いたお気に入りの実装

jun9
jun9

総合スコア19

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Monaca

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

1回答

0評価

0クリップ

229閲覧

投稿2022/06/04 09:47

前提

現在MonacaでAngular JSを用いたバスロケーションアプリを作っています。

実現したいこと

トップページ(top.html)に路線のリストが存在します。
トップページの路線をlocalstorageに保存し、お気に入りページ(favorite.html)で表示されるようにしたいと考え、下記の通り実装しました。

①トップページのお気に入りボタンクリック
② a)localstorageに該当の路線が保存されている場合 : localstorageに該当から路線を削除
b)localstorageに該当の路線が保存されていない場合 : localstorageに該当の路線を保存

 【top.html】
イメージ説明
【favorite.html】
イメージ説明

topページの状態で任意の路線のお気に入りボタンを2回押した場合、1回目で保存され、2回目で削除されているのが分かりました。(お気に入りページには何も保存されていない)

しかしながら、topページの状態である路線のお気に入りボタンを1回押し、一度topページを離れた後、再びtopページの同じ路線お気に入りボタンを1回押した場合、localstorageから削除されず、再び追加されてしまいます。

お気に入りの追加削除を行う関数(this.addFavorite())内の "indexOf " で存在しているはずの配列が検索されていないことが分かりますが、原因が分かりません。

もし原因が分かる方がいらっしゃいましたらご教示いただけますと幸いです。
よろしくお願いいたします。

該当のソースコード

top.html

<ons-page > <div ng-controller="topCtrl as top"> <ons-toolbar style="background-color:#6699CC"> <div class="left"> <ons-back-button><p></p></ons-back-button> </div> <div class="center"> 路線検索 </div> </ons-toolbar> <div class="list"> <ons-list> <ons-list-item modifier="chevron" class="top" ng-repeat="title in top.title track by $index" > <ons-row> <ons-col > <div class="number">{{title.number}}</div> <div class="title">{{title.dep}} - {{title.arr}}</div> </ons-col> <ons-col ngclick="top.addFavorite(title.index)"> <div class="favorite"> <ons-icon class="add" icon="fa-heart"></ons-icon> </div> </ons-col> </ons-row> </ons-list-item> </ons-list> </div> </ons-page>

favorite.html

<ons-page> <div ng-controller="favoriteCtrl as favorite"> <ons-toolbar style="background-color:#6699CC"> <div class="left"> <ons-back-button></ons-back-button> </div> <div class="center"> Myバス路線 </div> </ons-toolbar> <div class="list"> <ons-list > <ons-list-item modifier="chevron" class="top" ng-repeat="title in favorite.favoriteList track by $index" > <ons-row> <ons-col > <div class="number">{{title.number}}</div> <div class="title">{{title.dep}} - {{title.arr}}</div> </ons-col> </ons-row> </ons-list-item> </ons-list> </div> </ons-page>

titleService.js

app.value('titleService',{ title : [ { index:0, number:"RH01", arr:"六本木ヒルズ", dep:"渋谷駅前", routeNote1:"RH01:渋谷駅前→六本木ヒルズ:8403:1", routeNote2:"RH01:六本木ヒルズ→渋谷駅前:8403:2", timeNote1:"RH01:渋谷駅前→六本木ヒルズ:RH01 六本木ヒルズ行:8403:1:09-100", timeNote2:"RH01:六本木ヒルズ→渋谷駅前:RH01 渋谷駅前行:8403:2:09-100", time1:["10:15","10:20","10:22","10:23","10:28",], time2:["08:19","08:22","08:25","08:26","08:28","08:29","08:30","08:34",], }, { index:1, number:"市01", arr:"豊洲市場", dep:"新橋駅前", routeNote1:"市01:新橋駅前→豊洲市場:107:1", routeNote2:"市01:豊洲市場→新橋駅前:107:2", timeNote1:"市01:新橋駅前→豊洲市場:市01 豊洲市場行:107:1:01-105", timeNote2:"市01:豊洲市場→新橋駅前:市01 新橋駅前行:107:2:01-105", time1:["05:18","05:20","05:21","05:22","05:26","05:29","05:30","05:34","05:36","05:44",], time2:["07:18","07:22","07:25","07:30","07:32","07:34","07:38","07:45",], } ] });

app.js

app.controller('topCtrl',function(titleService){ this.title=JSON.parse(JSON.stringify(titleService.title)); var currentFavorite=JSON.parse(window.localStorage.getItem('saveData')); if(currentFavorite==null) { //Localstorageにデータがない場合 this.favoriteList=[]; }else{ this.favoriteList=currentFavorite; } this.addFavorite=function(val){    //配列の何番目に該当の系統があるか var checkitem = this.favoriteList.indexOf(this.title[val]);  if(checkitem != -1){ //a) localstorageに既に該当の系統が含まれるとき this.favoriteList.splice( checkitem, 1 );//localstorageから該当の系統を削除 window.localStorage.setItem('saveData',JSON.stringify(this.favoriteList)); }else{//b) localstorageに既に該当の系統が含まれないとき this.favoriteList.push(this.title[val]);//localstorageに該当の系統を保存 window.localStorage.setItem('saveData',JSON.stringify(this.favoriteList)); } } }); app.controller('favoriteCtrl',function(){ this.favoriteList= JSON.parse(window.localStorage.getItem('saveData')); });

試したこと

localstorageに任意の路線が保存されているか確認する方法として、indexOf() 以外にも、findIndex()も使用しましたが同じ結果となりました。

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

開発プラットフォーム:Monavca
使用言語:JavaScript(Angular JS)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Monaca

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