Как решить эту проблему круговой зависимости? - PullRequest
1 голос
/ 19 июня 2019

У меня есть три класса: пользователь, учетная запись и модель.Пользователь и Учетная запись расширяют класс Model.

User.js:

import Model from '@/classes/Model'
export default class User extends Model {
  constructor(data) {
    super(data)
  }
}

Account.js:

import Model from '@/classes/Model'
export default class Account extends Model {
  constructor(data) {
    super(data)
  }
}

И Model.js:

import Account from '@/classes/Account'
import User from '@/classes/User'

export default class Model {
  static _classesMapping = {
    Account,
    User
  }

  constructor(data) {
    ...
  }

  static create(models) {
    return new Model._classesMapping[this.name](models)
  }
}

Я хочу создать экземпляры Account и User из статического метода create в Model следующим образом: Account.create ()

Тем не менее, я получаю эту ошибку при компиляции: «Супер-выражение должно быть либо нулевым, либофункция "из-за проблемы циркулярной зависимости.Я не знаю, как решить эту проблему, не передавая класс в качестве аргумента методу Model.create, как это, что я нахожу уродливым

Account.create(data, Account)

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Я хочу создать Account и User экземпляры из статического метода для создания в Model, например: Account.create()

Ну, тебе не нужно _classesMapping для этого. Вы можете просто получить доступ к конструктору с помощью this, вам не нужно искать его по имени.

// Model.js:
export default class Model {
  constructor(data) {
    …
  }

  static create(models) {
    return new this(models)
  }
}

Это решает проблему циклической зависимости, просто удаляя зависимость: -)

0 голосов
/ 19 июня 2019

Я думаю, что лучший способ решить эту проблему - переместить classesMapping во внешний файл.

Итак, вы получите

  • model.js
    • user.js
    • Account.js
  • ClassMapping.js
    • который импортирует User и Account и импортируется Model.js
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...