Ответ 1
Из-за того, как "это" ключевое слово работает в javascript, скрипт создает псевдоним "_this" для вас. Это по дизайну, и отлично, когда вы знаете, как это работает.
Ваш пример:
class Person { firstname = ko.observable <string>(); lastname: ko.observable <string>(); fullname = ko.computed( () = > { // Точка останова здесь return this.firstname() + '' + this.lastname(); });
}
Код>
Скомпилируется:
var Person = (function() { function Person() { var _this = this; this.firstname = ko.observable(); this.lastname =(); this.fullname = ko.computed(function() { // Точка останова здесь return _this.firstname() + '' + _this.lastname(); }); } возвращение лица;
})();
Код>
Это показывает (как вы упомянули), что "это" в вашей вычисленной функции fullname скомпилировано в "_this". Ваша проблема с отладкой заключается в том, что Visual Studio отлаживает скомпилированный javascript. И в javascript "это" внутри функции означает что-то еще, читайте больше об этом "в javascript здесь.
Typcript создает эту ссылку, когда вы используете функцию лямбда, т.е.
class foo {
something: string = "some string";
foo1 =() = > {this.something} foo2() {this.something}
}
Код>
Скомпилируется:
var foo = (function() { функция foo() { var _this = this; this.something = "some string"; this.foo1 = function() {_this.something; }; } foo.prototype.foo2 = function() {this.something; }; return foo;
})();
Код>
Если правильно использовать лямбда-функции в машинописном тексте, решается "этот" ад из javascript. В большинстве случаев вам не нужно думать о том, когда использовать лямбда или функции, но в некоторых случаях вы это делаете. Более подробную информацию о лямбда-функциях можно найти здесь.
Короткий ответ для работы с этим - проверить это при работе с лямбдами, пока он не будет исправлен. Для него есть открытая проблема: https:// typescript.codeplex.com/workitem/1655.