0

您好,我正在尝试使用 Angular 2 的 DI 注入变量以更改在 BabylonJs 中初始化的对象的状态。

我曾经[(ngModel)]="Service.var"读取变量并ngModel Change)="methode"在我的组件中调用一个方法。结果是节点服务器的巨大压力和内存的巨大增加。

最好的解释是旧组件没有被删除,每次我触发 DI 时都会重新创建一个新的 Babylon JS 实例。

目标:WebGl 对象从Injectable()类中读取更改而不创建新实例:

我的目标是找到一种方法来更改在巴比伦 JS 引擎调用的内部第一次创建的矩阵对象的状态,createSeane()而不恢复创建的第一个引用并实时查看更改。如果在菜单组件中实现单击,则服务将更改,Babylon JS 组件将检测更改并再次使用新更改再次计算并在画布中绘制新更改。

我怎样才能实现最好的设计模式,我应该如何解决问题并实现我的目标?

4

1 回答 1

0

如果我在关注,您想在 ng 2 个组件中保留和重用巴比伦场景对象的状态吗?我只是通过创建一个场景服务组件为我的项目做了类似的事情,该组件被注入到每个需要引用它的类中。

我选择不在服务组件中实际初始化场景(考虑到组件生命周期和我的代码中初始化场景的点)而是在初始化画布时设置场景服务场景。

完成后,组件可以根据需要共享和使用巴比伦场景服务组件:

场景服务.ts

import { Injectable } from '@angular/core';

@Injectable()
export class SceneService {
    private _scene:BABYLON.Scene;

    get scene(): BABYLON.Scene {
        return this._scene;
    }

    set scene(scene:BABYLON.Scene){
        this._scene = scene;
    }
}

babylon.component.ts

@Component({
  selector: 'app-babylon',
  templateUrl: './babylon.component.html',
  styleUrls: ['./babylon.component.css']
})
export class BabylonComponent implements OnInit, OnDestroy  {

  constructor(private babylonEngine:BabylonEngine, private sceneSerice:SceneService, private fileSystem:FileSystem) { }

  scene:BABYLON.Scene = null;

  ngOnInit(): void { 
    var canvas = document.getElementById('renderCanvas') as HTMLCanvasElement;
    var engine = this.babylonEngine.init(canvas);

    // create a basic BJS Scene object
    this.scene = new BABYLON.Scene(engine);
    this.sceneSerice.scene = this.scene;
}
}

初始化场景的一些用户:

@Component({
  selector: 'app-scene-editor',
  templateUrl: './scene-editor.component.html',
  styleUrls: ['./scene-editor.component.css']
})

export class SceneEditorComponent implements OnInit {
  @ViewChild('jscolor') input;

  constructor(private sceneService:SceneService, public fileSystem:FileSystem) {    
  }

  ngOnInit():void {
    this.meshes = this.sceneService.scene.meshes;
    this.materials = this.sceneService.scene.materials;
  }
}

app.module.ts

  providers: [
    SceneService,
    FileSystem,
    BabylonEngine
  ],
于 2017-01-02T16:47:04.483 回答