У меня есть сообщение об ошибке, как говорится в заголовке. Я искал решение здесь, но, к сожалению, @Injectable() не работает, так как я работаю с интерфейсами, и я тоже пробовал @Input(). То, что я пытаюсь сделать здесь, — это шаблон Observer, чтобы получать уведомления, когда что-то происходит по щелчку.
Я попытался скопировать этот паттерн из этого видео сюда: https://thewikihow.com/video_GioexP_s5Yc. Я несколько раз проверял свой код, и он ничем не отличается, кроме того, что я использую Angular и пытаюсь адаптировать этот шаблон между двумя компонентами.
Это моя установка:
наблюдатель.interface.ts
export interface Observer {
update(fileName: string);
}
тема.interface.ts
import { Observer } from "./observer.interface";
export interface Subject {
registerObserver(o: Observer);
removeObserver(o: Observer);
notifyObservers();
}
XComponent.ts
export class FileExplorerComponent implements OnInit, Subject {
fileString: string;
private observers: Observer[] = [];
showFile(fileName) {
this.fileString = fileName;
this.notifyObservers();
}
public registerObserver(o: Observer) {
this.observers.push(o);
}
public removeObserver(o: Observer) {
let index = this.observers.indexOf(o);
this.observers.splice(index, 1);
}
public notifyObservers() {
for (let observer of this.observers) {
observer.update(this.fileString);
}
}
}
YComponent.ts
import { Subject } from '../X/subject.interface';
import { Observer } from '../X/observer.interface';
export class JsonBuilderComponent implements Observer {
subject: Subject;
constructor(fileExplorer: Subject){
this.subject = fileExplorer;
fileExplorer.registerObserver(this);
}
update(fileName: string) {
console.info('I need to update my Editor with ' + 'fileName');
}
}
Тема интерфейса в моем случае прописана в конструкторе. fileExplorer: Subject
Я действительно не могу ответить вам на этот вопрос. Все, что я в основном хочу, это чтобы компонент X уведомлял компонент Y о том, что что-то было нажато в компоненте X, и задавал параметры. Именно тогда я обнаружил эту наблюдаемую закономерность. Я пробовал ^^'. Я не знаю, как правильно.
Хорошо, я вижу. Ваши компоненты находятся на том же уровне? У них один и тот же родитель?





Angular пытается создать и внедрить объект fileExplorer в YComponent. Но интерфейс не может быть создан. Вам нужно создать инъекционный класс, который расширяет интерфейс Subject, и внедрить его в свой компонент. На видео видно, что Workstation расширяет Subject.
Если вы хотите общаться между компонентами, насколько мне известно, есть 3 способа:
- Passing the reference of one component to another
- Communication through parent component
- Communication through Service
Вот статья
поэтому класс, который расширяет Subject, в моем случае FileExplorerComponent. В этом случае мне нужно внедрить этот класс в JsonBuilderComponent? Если я правильно понял.
Вы пытаетесь внедрить интерфейс в свой компонент? FileExplorer является экземпляром какого класса?