Рекурсивность без методов-хелперов сделать невозможно даже если исполнять код модели рекурсивно, все сводится к тому что пока функция не исполнилась полностью, то неизвестно, что она возвращает, а это значит, что прямое обращение к свойствам невозможно:
const triggerFamilyChangeName = createEvent<{id: string, value: number}>()
const user = model({
props: {name: '', age: 18} as Family,
output: {
motherName: '',
changeName: createEvent(),
},
create({name, age, familyItems}, {onMount}) {
const addFamily = createEvent<Family>()
const $family = createStore<Family[]>([])
$family.on(addFamily, (items, item) => [...items, item])
const family = list($family, (props) => spawn(user, props))
const mother = spawn(user, {name: 'alice'})
const changeName = createEvent<number>()
age.on(changeName, (_, upd) => upd)
pushToKv({
kv: family,
source: familyItems,
getKey: 'name'
})
sample({
clock: triggerFamilyChangeName,
target: pushToKv({
kv: family,
})
})
return {
$name: name,
motherName: mother.$name,
changeName,
addFamily,
sendToServer: () => {},
mother,
family,
}
}
})
Самый оптимальный вариант работы с рекурсивностью, учитывая возможности эффектора по отложенному описанию связей, это функция lazy/rec которая бы выполнялась уже после завершения вычисления самой модели:
const user = model({
props: {name: '', age: 18},
create({name, age}, {onMount}) {
const $motherName = createStore('')
// const $fullName = combine(name, $motherName)
lazy(() => {
const mother = spawn(user, {name: 'alice'})
sample({
clock: onMount,
source: mother.$name,
target: $motherName,
})
})
return {
$name: name,
$motherName,
$fullName,
}
}
})
Открытый вопрос: как создавать стор, значение которого бы при инициализации читалось из стора созданного в lazy, sample запишет значение в стор лишь после первого апдейта
Как технически реализовывать рекурсивность — вопрос открытый. Есть две проблемы, локальная и глобальная Локальная: что будет содержать инстанс ещё не инициализированной модели Глобальная: как производить поиск нужных данных в рекурсивно описанном дереве