promisejs控制器成员在promise返回后未定义

时间:2014-08-16 18:58:39

标签: angularjs typescript

我在控制器中有一个执行以下代码的方法:

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>();              

        });            
    }
}

控制器通过坐在另一个控制器中的角度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 个答案:

答案 0 :(得分:0)

在评论主题中经过一些来回,结果发现这里有两件事情,所以将信息整合到答案中:

  1. 检查这个&#39;在.ts文件的调试器中,知道您将看到实际的&#39;这个&#39;值,而不是使用箭头函数时在.js文件中创建的_this别名。这有时会让变量看起来没有变得固定,而实际上,你正在检查错误的变量。在_this上设置手表将显示正确的手表。您还可以选择在&#39;这个&#39;上使用console.log。在TypeScript代码本身,因为它将编译为使用_this别名。

  2. ng-options无法使用ng-model