私は、プロジェクトのクラス階層=> task_lists =>各配列が@ observableであるタスクを持っています。プロジェクトのすべてのtask_listsからすべてのタスクを集約するプロジェクトから "@computed get allTasks"を作成します。mobxで観測可能なリストの集合体である計算ゲッターを宣言する方法
class MsiTask {
@observable name:string;
constructor() {.... };
}
class MsiTaskList {
@observable tasks:MsiTask[];
constructor() {.... };
}
class MsiProject {
id:string;
@observable name:string;
@observable taskLists:MsiTaskList[]=[];
constructor (data) {
$log.debug ('Constructing a Project with', data, this);
this.id = data.id;
this.name = data.name;
ProjectCache[this.id] = this;
/** Can I do reassign taskLists or should I fill it? **/
this.taskLists = lodash.map (data.taskLists || [], (taskList) => {
return new MsiTaskList (taskList, this);
});
}
createTaskList (title:string) : MsiTaskList {
let taskList = new MsiTaskList ({ name: title, id: MsiUtils.uuid() }, this);
$log.debug ('add task list', title, taskList);
this.taskLists.push (taskList);
return taskList;
}
}
私は現在、それをこのように定義する:
クラスMsiProjectで...
@computed get allTasks() : MsiTask[] {
var arrayOfTasks = lodash.map(this.taskLists, 'tasks');
var result = lodash.reduce(arrayOfTasks, (res, array) => {
lodash.each (array, (it) => { res.push(it); });
return res;
}, []);
return result; // tried also return observable.array (result);
}
が、私のカスタムコンポーネントで使用された場合、私はダイジェストサイクルエラーを取得しています:
私はallTasksが毎回別の配列を返すことを理解していますが、私の考えでは、mobxはその内容が変更されておらず、ダイジェストサイクルも生成していないと考えます。
私はmobxの使い方を完全に理解していませんか?
あなたは全体 'MsiProject'クラス、コンポーネント、およびエラーのスタックトレースを含めていただけますか? – Tholle
ありがとう@Tholle。私はMsiProjectsにいくつかのコードを追加しました。それを見て、FAQを読んでいる間、私はコンストラクタthis.taskListsに再割り当てしていましたが、それはおそらく問題です。私は間違いなくそれを埋めるべきです。 (プログラムで自分のコードを変更してから試してみる必要があります)。どう思いますか?それは問題ですか?私はそれを新しい観測可能物で包んでおくべきですか?それはデコレータを混乱させるだろうか? –