2016-08-24 21 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); 
    } 
}; 

このラッパーは、3つのモデルのコンテナにする必要があります。読み込みはうまくいきますが、モデルを変数に保存しようとすると、内部スコープの外に変更された内部メンバーはありません。

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

私はアプリをデバッグし、モデルがロードされるまで待っていれば、私は内部のメンバーの上にマウスを置くことができ、それらが装着されているので、それは奇妙です。 spacemanオブジェクトの上にマウスを置くと、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

関連する問題