Q&A
前提
現在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
1<ons-page > 2 <div ng-controller="topCtrl as top"> 3 <ons-toolbar style="background-color:#6699CC"> 4 <div class="left"> 5 <ons-back-button><p></p></ons-back-button> 6 </div> 7 <div class="center"> 8 路線検索 9 </div> 10 </ons-toolbar> 11 <div class="list"> 12 <ons-list> 13 <ons-list-item modifier="chevron" class="top" ng-repeat="title in top.title track by $index" > 14 <ons-row> 15 <ons-col > 16 <div class="number">{{title.number}}</div> 17 <div class="title">{{title.dep}} - {{title.arr}}</div> 18 </ons-col> 19 <ons-col ngclick="top.addFavorite(title.index)"> 20 <div class="favorite"> 21 <ons-icon class="add" icon="fa-heart"></ons-icon> 22 </div> 23 </ons-col> 24 </ons-row> 25 </ons-list-item> 26 </ons-list> 27 </div> 28</ons-page>
favorite.html
1<ons-page> 2 <div ng-controller="favoriteCtrl as favorite"> 3 <ons-toolbar style="background-color:#6699CC"> 4 <div class="left"> 5 <ons-back-button></ons-back-button> 6 </div> 7 <div class="center"> 8 Myバス路線 9 </div> 10 </ons-toolbar> 11 <div class="list"> 12 <ons-list > 13 <ons-list-item modifier="chevron" class="top" ng-repeat="title in favorite.favoriteList track by $index" > 14 <ons-row> 15 <ons-col > 16 <div class="number">{{title.number}}</div> 17 <div class="title">{{title.dep}} - {{title.arr}}</div> 18 </ons-col> 19 </ons-row> 20 </ons-list-item> 21 </ons-list> 22 </div> 23</ons-page>
titleService.js
1app.value('titleService',{ 2title : [ 3 { 4 index:0, 5 number:"RH01", 6 arr:"六本木ヒルズ", 7 dep:"渋谷駅前", 8 routeNote1:"RH01:渋谷駅前→六本木ヒルズ:8403:1", 9 routeNote2:"RH01:六本木ヒルズ→渋谷駅前:8403:2", 10 timeNote1:"RH01:渋谷駅前→六本木ヒルズ:RH01 六本木ヒルズ行:8403:1:09-100", 11 timeNote2:"RH01:六本木ヒルズ→渋谷駅前:RH01 渋谷駅前行:8403:2:09-100", 12 time1:["10:15","10:20","10:22","10:23","10:28",], 13 time2:["08:19","08:22","08:25","08:26","08:28","08:29","08:30","08:34",], 14 }, 15 { 16 index:1, 17 number:"市01", 18 arr:"豊洲市場", 19 dep:"新橋駅前", 20 routeNote1:"市01:新橋駅前→豊洲市場:107:1", 21 routeNote2:"市01:豊洲市場→新橋駅前:107:2", 22 timeNote1:"市01:新橋駅前→豊洲市場:市01 豊洲市場行:107:1:01-105", 23 timeNote2:"市01:豊洲市場→新橋駅前:市01 新橋駅前行:107:2:01-105", 24 time1:["05:18","05:20","05:21","05:22","05:26","05:29","05:30","05:34","05:36","05:44",], 25 time2:["07:18","07:22","07:25","07:30","07:32","07:34","07:38","07:45",], 26 } 27 ] 28}); 29
app.js
1app.controller('topCtrl',function(titleService){ 2this.title=JSON.parse(JSON.stringify(titleService.title)); 3 var currentFavorite=JSON.parse(window.localStorage.getItem('saveData')); 4 if(currentFavorite==null) { //Localstorageにデータがない場合 5 this.favoriteList=[]; 6 }else{ 7 this.favoriteList=currentFavorite; 8 } 9 10 this.addFavorite=function(val){ 11 //配列の何番目に該当の系統があるか 12 var checkitem = this.favoriteList.indexOf(this.title[val]); 13 if(checkitem != -1){ //a) localstorageに既に該当の系統が含まれるとき 14 this.favoriteList.splice( checkitem, 1 );//localstorageから該当の系統を削除 15 window.localStorage.setItem('saveData',JSON.stringify(this.favoriteList)); 16 }else{//b) localstorageに既に該当の系統が含まれないとき 17 this.favoriteList.push(this.title[val]);//localstorageに該当の系統を保存 18 window.localStorage.setItem('saveData',JSON.stringify(this.favoriteList)); 19 } 20 } 21}); 22 23app.controller('favoriteCtrl',function(){ 24 this.favoriteList= JSON.parse(window.localStorage.getItem('saveData')); 25});
試したこと
localstorageに任意の路線が保存されているか確認する方法として、indexOf() 以外にも、findIndex()も使用しましたが同じ結果となりました。
補足情報(FW/ツールのバージョンなど)
開発プラットフォーム:Monavca
使用言語:JavaScript(Angular JS)
回答1件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。