Я не уверен, что у меня возникла проблема ... если это "Я хотел бы иметь бесконечную цепочку без ручного бесконечного вложения", это мое решение.
Обеспечение единой ответственностиПринцип - это ключ к решению этой проблемы:)
Как вы можете видеть в своем коде, метод createTier
выполняет четыре вещи (что слишком много):
- создает новый уровень;
- присоединяет к нему обработчик (со своим собственным определением, слишком много);
- добавляет новый уровень к группе и домену;
- координируйте эти шаги.
Я бы выбрал из этого метода два отдельных для:
- создания уровня с его обработчиком;
- добавление уровня.
В отдельности подготовка уровня может быть примерно такой:
buildTier() {
let tier = new Tier();
tier.$select.on('change', /* something here */)
return tier
}
Добавление уровня вместо этого может быть чем-то вроде:
appendTier(tier) {
this.$tiersContainer.append(tier.$select);
this.group.push(tier);
}
Теперь давайте оставим работу по координации этого материала на уровне создания, этостанет:
createTier() {
const newTier = this.buildTier()
this.appendTier(newTier)
}
или даже:
createTier() {
this.appendTier(this.buildTier())
}
Как видите, каждый метод делает только одну вещь.Интересно то, что нигде уровень не связан с его потомком или родителем, что означает, что мы можем использовать createTier
в качестве обработчика для выбора, обращая внимание на передачу текущего контекста:
buildTier() {
let tier = new Tier();
tier.$select.on('change', this.createTier.bind(this))
return tier
}
Надеюсь, это поможет:)
https://jsbin.com/wuviqoxohu/edit?html,js,output