У меня есть метод в контроллере, который выполняет следующий код:
this.StockService.GetByInvoicesID(this.SelectedInvoice.ID).success((StockItems) =>
{
this.StockItems = StockItems;
this.CreditNoteStockItems = new Array<ViewModels.CreditNoteStockItemViewModel>();
}
Перед вызовом этого метода службы определяются все члены в контроллере. Однако после выполнения обещания this.StockItems и this.CreditNoteStockItems становятся неопределенными. Кроме того, назначение StockItems не отражается в представлении. Я предполагаю, что это проблема области действия, и обещание возвращается в новую область. Это случалось и раньше с другими методами, кажется, что это происходит случайно.
Мои вопросы: может ли кто-нибудь сказать мне, почему именно это происходит, и, что более важно, как я могу предотвратить это?
Изменить: это упрощенная версия моего контроллера (все, чего не хватает, это несколько членов и методов)
Изменить 2: дополнительная информация о методе в контроллере
export class CreditNoteController
{
static $inject = ['$scope', '$modalInstance', 'StockService'];
StockService: Services.StockService;
ModalInstance: ng.ui.bootstrap.IModalServiceInstance;
constructor($scope, $modalInstance, StockService: Services.StockService)
{
$scope.vm = this;
this.ModalInstance = $modalInstance;
this.StockService = StockService;
}
InvoicesSelectionChanged()
{
this.StockService.GetByInvoicesID(this.SelectedInvoice.ID).success((StockItems) =>
{
this.StockItems = StockItems;
this.CreditNoteStockItems = new Array<ViewModels.CreditNoteStockItemViewModel>();
});
}
}
Контроллер вводится через метод открытия модальной службы angular UI, находящийся в другом контроллере:
this.ModalService.open(
{
templateUrl: URL,
controller: Controllers.CreditNoteController,
});
Изменить 2: javascript, который он генерирует
CreditNoteModalController.prototype.InvoicesSelectionChanged = function () {
var _this = this;
this.StockService.GetByInvoicesID(this.SelectedInvoice.ID).success(function (StockItems) {
_this.StockItems = StockItems;
_this.CreditNoteStockItems = new Array();
});
};
Благодарность
1 ответ
После некоторой перемотки в ветку комментариев выясняется, что здесь происходили 2 вещи, поэтому объедините информацию в ответ:
Проверяя this в отладчике в файле .ts, знайте, что вы увидите фактическое значение this, а не псевдоним _this, который создается в файле .js, когда вы используете стрелочные функции. Иногда может показаться, что переменные не устанавливаются, когда на самом деле вы проверяете не ту переменную. Установка часов на _this покажет правильные. У вас также есть возможность использовать console.log для this в самом коде TypeScript, поскольку он будет компилироваться с использованием псевдонима _this.
ng-options не будет работать без ng-модели
Похожие вопросы
Новые вопросы
angularjs
Используйте для вопросов об AngularJS (1.x), JavaScript-фреймворке с открытым исходным кодом. НЕ используйте этот тег для Angular 2 или более поздних версий; вместо этого используйте тег [angular].
this
, вероятно, не то, что вы думаете внутри обработчика успехаthis
в выражениях стрелочных функций. При переводе на JavaScript TypeScript добавит объявлениеvar _this = this
перед вызовом, а затем стрелочная функция станет_this.StockService
, которая должна работать.CreditNoteController
. Как именно приведенный выше код находится внутриCreditNoteController
? Если вы поместите его точно так, как указано выше, в указанную позицию вы получите недопустимый TypeScript. Его нужно обернуть в метод. Пожалуйста, также разместите соответствующий сгенерированный JavaScript.this
переводится на_this
, как положено?