У меня есть метод в контроллере, который выполняет следующий код:

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
Walter 16 Авг 2014 в 22:58
1
this, вероятно, не то, что вы думаете внутри обработчика успеха
 – 
charlietfl
16 Авг 2014 в 23:39
1
Не могли бы вы показать, как вы определяете и используете этот контроллер?
 – 
Egor Smirnov
16 Авг 2014 в 23:40
Я добавил больше информации о контроллере в свой пост.
 – 
Walter
17 Авг 2014 в 01:40
@charlietfl, TypeScript переопределяет код, относящийся к this в выражениях стрелочных функций. При переводе на JavaScript TypeScript добавит объявление var _this = this перед вызовом, а затем стрелочная функция станет _this.StockService, которая должна работать.
 – 
Samuel Neff
17 Авг 2014 в 01:57
Пожалуйста, опубликуйте больше CreditNoteController. Как именно приведенный выше код находится внутри CreditNoteController? Если вы поместите его точно так, как указано выше, в указанную позицию вы получите недопустимый TypeScript. Его нужно обернуть в метод. Пожалуйста, также разместите соответствующий сгенерированный JavaScript. this переводится на _this, как положено?
 – 
Samuel Neff
17 Авг 2014 в 01:58

1 ответ

Лучший ответ

После некоторой перемотки в ветку комментариев выясняется, что здесь происходили 2 вещи, поэтому объедините информацию в ответ:

  1. Проверяя this в отладчике в файле .ts, знайте, что вы увидите фактическое значение this, а не псевдоним _this, который создается в файле .js, когда вы используете стрелочные функции. Иногда может показаться, что переменные не устанавливаются, когда на самом деле вы проверяете не ту переменную. Установка часов на _this покажет правильные. У вас также есть возможность использовать console.log для this в самом коде TypeScript, поскольку он будет компилироваться с использованием псевдонима _this.

  2. ng-options не будет работать без ng-модели

0
bingles 29 Авг 2014 в 08:59