前提・実現したいこと
ons-lazy-repeat内に、ローカルDBのデータをリストにして表示させ、
さらに、この表示内容を、ユーザのソートリクエスト条件に合わせて変更する。
という機能を実装したいと思い、色々試してはみたのですが、解決方法が見つかりません。
同じ問題を解決された方がいらっしゃいましたらご教授いただけないでしょうか。
※前提、補足
・Angularであれば表示変更する方法について情報がありそうだったのですが、Angularで構築していない為、javascriptだけで表示変更する方法を探しております。
・リストは200~300件を見込んでおり、実際に「ons-lazy-repeat」無し(appendchildでDOM構築)で表示すると、機種によっては多少動作が重い印象です。その為できれば「ons-lazy-repeat」を使用したいと思っています。
・大変申し訳ないのですが、周りにアプリ開発者の方もおらず、1年半ほど独学で構築している為、当たり前のことがわかっていないかもしれません。
<処理概要>
「ons-lazy-repeat」で表示させるまでの処理は以下の通りです。
1.ユーザがソート条件を選択(idが001~100まで等)
2.ローカルのIndexedDBから、ソート条件にあったデータを抽出し、変数へ代入
3.「ons-lazy-repeat」を描写している関数に表示したいデータを渡す
4.「ons-lazy-repeat」の内容描写
※ユーザが表示を変更したいと思ったら、また1から繰り返し
code
1 2<html> 3~ 4<template id="list.html"> 5 <ons-page id="listPage"> 6 7 <div> 8 <ons-list> 9 <ons-lazy-repeat id="infinite-list"></ons-lazy-repeat> 10 </ons-list> 11 </div> 12 13 </ons-page> 14</template> 15 16</html> 17 18 19<tmp.js> 20 21//データ格納(1,2の処理の部分を簡潔に記載した形になります) 22let lazyData=[{id:A001 , data1:aaa, data2:bbb }{id:U002 , data1:ccc, data2:ddd }…]; 23 24//ons-lazy-repeatの描写 25var makelazy = function(recData,recDataLength){ 26 27 var infiniteList = document.getElementById('infinite-list'); 28 29 infiniteList.delegate = { 30 createItemContent: function(i) { 31 32 // ===== 33 ここの記載の仕方で悩んでいます 34 // ==== 35 36 return dom; 37 38 }, 39 countItems: function() { 40 return recDataLength; 41 }, 42 calculateItemHeight:function() { 43 return 10; 44 //calculateItemHeight:functionがないとエラーになってしまうので入れています。 45 } 46 }; 47 infiniteList.refresh(); 48}; 49 50 51//makelazyと呼び出し+データと、データ数を引き渡し 52makelazy(lazyData,lazyData.Length); 53
発生している問題・エラーメッセージ 試したこと
iを引数に、配列を総当たりさせてみました
アプリ起動時は表示されるのですが、makeLazyをもう一度呼び出すと
「TypeError: undefined is not an object (evaluating 'recData[i].id')」
のエラーが出力。
1度だけ表示は変更されますが、それ以降呼び出ししても変更されず、エラーも毎回出力しています。
javascript
1 infiniteList.delegate = { 2 createItemContent: function(i) { 3 4 dom = ons.createElement( 5 '<ons-list> 6 <ons-list-header>name:' + recData[i].id + '</ons-list-header> 7 <ons-list-item>no1' + recData[i].data1 + '</ons-list-item> 8 <ons-list-item>no2' + recData[i].data2 + '</ons-list-item> 9 </ons-list>'); 10 11 return dom; 12 13 }, 14~省略~ 15 16ソートリクエスト1 全て表示 17name:A001 18no1:aaa 19no2:bbb 20 21name:U002 22no1:ccc 23no2:ddd 24~ 25↓ 26 27ソートリクエスト2 id U002だけ表示 28name:U002 29no1:ccc 30no2:ddd 31※エラーはでるが表示 32↓ 33 34ソートリクエスト3 全て表示 35name:U002 36no1:ccc 37no2:ddd 38※エラー出力、表示も変わらず 39 40
ただ、以下のように配列を使用しない場合は、何回でも表示を変更することができました。
javascript
1//testボタンを適当に配置 2document.querySelector("#test").onclick = function(){ 3 4var infiniteList = document.getElementById('infinite-list'); 5var random = Math.ceil( Math.random()*100 ); 6 7 infiniteList.delegate = { 8 createItemContent: function(i) { 9 return ons.createElement('<ons-list-item tappable>createItem ' + i + '</ons-list-item>'); 10 }, 11 countItems: function() { 12 return random; 13 } 14 }; 15 infiniteList.refresh(); 16} 17 18' 191~100まで、クリックする度にランダム表示 20createItem 1 21createItem 2 22createItem 3 23createItem 4 24… 25' 26 27
その他
・createItemContent内でrecDataをfor~ofループ → 表示されず。
・infiniteList.createItemContent();という具合で、呼び出して使用する(スコープは意識しました) → 呼び出せませんでした。
・「.delegate」についても調査しましたが、jqueryのデリゲートの概念くらいしか見つけられず。
・githubの「ons-lazy-repeat.js」も見てみましたが、onsenUI公式の情報以上のことは見つけられませんでした。
長文で大変恐縮なのですが、よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
◆環境
Monaca
cordova 9
onsenUI 2.10.8
wkwebView
ios13.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/09 09:34
2020/06/12 06:06
2020/06/12 06:38