2015-09-20 3 views
2

Я использую библиотеку babylonjs и создал класс «Building» с машинописным текстом. Используя машинопись для всего, BTW. Я создаю это новое «здание» из своего основного класса game.ts «Game» и при попытке получить доступ к члену «Building», я получаю «неопределенные» переменные ошибки. Однако это происходит только в другом методе класса, но, похоже, работает корректно в конструкторе. Я предполагаю, что это имеет какое-то отношение к «этому» определению в javascript/машинописном тексте. Я попытался модифицировать функцию, выполнив:typescript класс не может найти «эту» переменную?

Create = ...(...)=> { 
    ... 

Я попытался создать переменную с помощью:

private rect: =() => Rectangle 

, но это по-прежнему не работает

Является ли это действительно проблема с «этим» поскольку ничего не работает. Ниже я точно обозначил, где эта переменная работает и где это не работает.

class Building { 

    private rect : Rectangle 
    private buildingMesh:string[] 
    private buildingId:string 

    constructor(rect: Rectangle, id:string) { 

     this.rect = rect 
     console.log("TL in b const: " + this.rect.topLeft.x) // <--- This works here 
     this.buildingId = id 

    } 

    Create(scene:BABYLON.Scene) { 

     BABYLON.SceneLoader.ImportMesh(this.buildingId, "models/","tree.babylon", scene, function (newMeshes) { 

      var idx = 0 

      console.log("TL in b: " + this.rect.topLeft.x) // <--- this gives me undefined 
      var wall =newMeshes[0].createInstance(this.buildingId + idx) 
      wall.position.x = this.rect.topLeft.x 
      wall.position.y = this.rect.topLeft.y 
      this.buildingMesh.push(this.buildingId + idx) 
      idx++ 
     }); 
    } 
} 

ответ

3

Я думаю, что вы почти там. Стрелка Функция (=>) синтаксис, что нам нужно, но даже на BABYLON.SceneLoader.ImportMesh вызова:

BABYLON.SceneLoader 
    .ImportMesh(this.buildingId, "models/","tree.babylon", scene, 
     function (newMeshes) { 
     ... 
     // here we do not have this kept by TS for us 
}); 

мы должны использовать

BABYLON.SceneLoader 
    .ImportMesh(this.buildingId, "models/","tree.babylon", scene, 
     (newMeshes) => { 
     ... 
     // here the magic would happen again 
     // and compiler will keep this to be what we expect 
}); 
+0

я вижу .. так я думаю, когда вы создаете анонимную функцию, которую он не знает, какое «это» использовать. Документ или класс? Здесь я на правильном пути? Попытка объяснить это, поэтому, если кто-то посмотрит это, они поймут, почему это сработало. Спасибо за помощь, хотя это сработало. Я буду отмечать его как фиксированный. – efel

+1

@efel Если вы создаете простую анонимную функцию, контекст (это ключевое слово this) всегда будет глобальной областью (обычно в браузерах глобальная область видимости является объектом 'window'). Когда вы используете функцию стрелки, контекст будет всегда тем же самым контекстом, что и вы, поэтому, если вы находитесь внутри метода класса, контекст будет объектом (экземпляр этого класса), а функция стрелки контекст будет таким же. Раньше, когда не было функции стрелки, обходной путь состоял в том, чтобы создать локальную переменную для ~ сохранения ~ контекста, а затем использовать ее внутри анонимной функции. – Buzinas

+1

То, как я буду использовать, чтобы объяснить это - TS-компилятор будет создавать 'var _this = this;', а затем использовать его внутри созданной функции стрелки '=>'. Итак, что было ** это ** снаружи, теперь это внутри ... Узнайте больше о функциях стрелок ... чтобы сделать это действительно ясно;) –

Смежные вопросы