ツリー構造のデータ取得

javascript REST x AngularJS にて掲示板のスレッド表示のような表現をしたいと思っています。

アプリのデータは


{ id:(int), parent:(親id), subject:(表題), body:(内容) }


コレを

[表題1]

Re:[表題1]

Re:[表題1]

    Re:Re:[表題1]

Re:[表題1]

[表題2]

 

上記の様な表現がしたく悩んでいます。

親データを取得してから再帰処理で取得すれば良いのだと思うのですが取得後に$scopeにセットして表示させたいです。

各データの取得を非同期で行った場合、最終的なデータ取得のタイミングをどのように取れば良いのかわかりません。

具体的には$applyのタイミングがわかりません。

どなたかご教授頂けませんか。
宜しくお願い致します。

 

藤村さんこんにちは。

kintoneのREST APIで再帰的にデータの取得を行うと大量にAPIを発行して時間もかかりますので、

一度データを取得してからJSでツリーに展開するのがよいと思います。

Angularはあまり詳しくないですがたぶんこんな感じです。

 

var Thread = {};

jQuery.noConflict();
(function($) {
"use strict";
Thread.Ctrl = function($scope) {
$scope.root = [];
};

kintone.events.on("app.record.index.show", function(e) {
var records = {};
var root = [];
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
'app': kintone.app.getId()}).then(function(resp) {
resp.records.forEach(function(record) {
records[record.id.value] = {
id: record.id.value,
parent: record.parent.value,
subject: record.subject.value,
body: record.body.value,
children: []
};
});
for (var id in records) {
var record = records[id];
if (!record.parent) {
root.push(record);
} else if (records[record.parent]) {
records[record.parent].children.push(record);
}
}

// スコープを取得
var scope = angular.element(document.querySelector('#thread')).scope();

scope.$apply(function(){
scope.root = root;
});
});
});
})(jQuery);

 

こちらも参考にしてみてください。

https://cybozudev.zendesk.com/hc/ja/articles/201297010

誰かどうやったらコード貼ったときにインデントが失われなくなるのか教えてください><

門屋さま、こんにちは。

回答ありがとうございます。

言われてみればそうですね、手元で処理したほうが良いですね。

 

javascriptのRESTではレコード数の制限は無いんでしたっけ?

あるようでしたらその処理も必要ですね。

そうですね。GET records.jsonの最大件数は現状500件だったと思います。

それ以上の場合は複数回に分けて取得する必要がありますね。

あとレコードは予めソートしておいたほうが処理しやすいと思います。

門屋さま、ありがとうございます。

 

スレッド毎にユニークなIDを振ってqueryレコード数を少なくします。

1スレッドの500件は上限として考えられる枠内なのでなんとかなりそうです。

ありがとうございました。