2016-08-24 23 views
0

我正在嘗試創建一個簡單的three.js應用程序,但我陷入了一些javascript的細微差別。我真的不知道該怎麼沒有一個例子來說明這個問題:函數調用後Javascript成員未更新

var Model = function() { 
    THREE.Object3D.call(this); 
    this.loadedMesh = null; 
    this.meshIsLoaded = false; 
}; 

Model.prototype = { 
    constructor: Model, 

    load: function(path, mtlName, objName) { 
     var onProgress = function(xhr) {...}; 

     var onError = function(err) {...}; 

     THREE.Loader.Handlers.add(/\.dds$/i, new THREE.DDSLoader()); 
     mtlLoader.setPath(path); 
     mtlLoader.load(mtlName, function(materials) { 
      materials.preload(); 
      objLoader.setMaterials(materials); 
      objLoader.setPath(path); 
      objLoader.load(objName, function(object) { 
       object.position.set(0, -5, 10); 
       object.scale.set(5, 5, 5); 
       object.rotation.y = Math.PI; // 180 degrees 
       scene.add(object); 
       this.loadedMesh = object; 
       this.meshIsLoaded = true; 
      }); 
     }, onProgress, onError); 
    } 
}; 

此包裝應該是三個模型的容器。加載工作正常,但是當我嘗試將模型保存到變量中時,沒有任何內部成員在模型範圍外被更改。

var spaceman = new Model(); 
spaceman.load("ACES/", "acesjustforroomshow.mtl", "acesjustforroomshow.obj"); 
... 
function update() { 
    if (spaceman.meshIsLoaded) 
     spaceman.loadedMesh.rotation.x += 0.1; 
} 

這很奇怪,因爲如果我調試應用程序,並等待模型加載,我可以將鼠標懸停在內部成員,他們被填充。當我將鼠標懸停在太空人對象上時,loadedMesh和meshIsLoaded的值仍然是默認值。

是否有原型的某些方面,我不理解這裏?

回答

0

我的猜測是問題是this變量。在你傳遞給objLoader.load的回調函數中,它可能不再被設置爲你的對象。如果我是正確的,無論是下方的修復應該工作:

使用bind

objLoader.load(objName, function(object) { 
    object.position.set(0, -5, 10); 
    object.scale.set(5, 5, 5); 
    object.rotation.y = Math.PI; // 180 degrees 
    scene.add(object); 
    this.loadedMesh = object; 
    this.meshIsLoaded = true; 
}.bind(this)); 

捕捉到另一個變量this

var that = this; 
objLoader.load(objName, function(object) { 
    object.position.set(0, -5, 10); 
    object.scale.set(5, 5, 5); 
    object.rotation.y = Math.PI; // 180 degrees 
    scene.add(object); 
    that.loadedMesh = object; 
    that.meshIsLoaded = true; 
}); 
+0

真棒!這正是問題所在。我用臨時'那個'可變方法去了。 – RomanLarionov