Вы можете использовать только @Output
для передачи данных из дочернего компонента в родительский компонент. Я думаю, что здесь ваш подход неправильный
Так что вы должны достичь этого с помощью службы:
Определен такой сервис, как показано ниже
@Injectable()
export class MyService {
$dataChange: Subject<any> = new Subject<any>();
}
Убедитесь, что добавили его вваш app.module.ts
@NgModule({
providers: [
MyService
]
})
И введите его в ThreejsComponent
и используйте его, как показано ниже
export class ThreejsComponent implements OnInit {
threejs: Threejscontroller;
constructor(private myService: MyService) { }
UpdateWebGL = (settingsData: Settings) => {
console.log('recieved message');
if (!settingsData.TimeNight) {
new TimeOfDay().SetTimeDay(this.threejs.scene);
} else {
new TimeOfDay().SetTimeDusk(this.threejs.scene);
}
}
ngOnInit() {
this.threejs = new Threejscontroller();
this.threejs.update();
this.myService.$dataChange.subscribe((value: any) => {
this.UpdateWebGL(value);
});
}
}
В ToolbarComponent
используйте, как показано ниже:
export class ToolbarComponent implements OnInit {
settingsData: Settings;
@Output() event: EventEmitter<Settings> = new EventEmitter<Settings>();
constructor(private myService: MyService) {
this.settingsData = this.defineSettings({ TimeNight: false });
}
defineSettings(config: Settings) {
const settings = { TimeNight: true };
if (config.TimeNight) {
settings.TimeNight = config.TimeNight;
}
return settings;
}
onChange() {
this.myService.$dataChange.next(this.settingsData);
console.log("emitted");
}
ngOnInit() {
const gui = new GUI();
gui.add(this.settingsData, 'TimeNight').onChange(() => {
this.onChange();
});
}
}
Я проверил ваш git-код, проблема с вашим импортом, пожалуйста, измените импорт с ThreejsComponent
import { SettingsService } from '../settings.service.js';
на
import { SettingsService } from '../settings.service';
Надеюсь, это поможет вам!