尝试在我的Typescript控制器中对Map执行键/值查找时,收到以下错误:
TypeError:this.cart.cases.get不是函数
然而,"得到"肯定是为Typescript Map定义的。调用控制器如下所示:
export class CaseController{
case: Case;
cart: IShoppingCart;
constructor(
private $location: ng.ILocationService,
private $mdDialog: ng.material.IDialogService,
private $scope: any,
private CaseService : CaseService,
private shoppingCartService : ShoppingCartService
){
"ngInject";
var self = this;
this.cartJSON = "";
this.case = self.CaseService.getCase()
this.cart = shoppingCartService.getCart();
}
public addDocument(doc:Document, caseForDoc:Case) {
var myCase:Case = this.cart.cases.get(caseForDoc.caseId);//Error here
if(!myCase){
myCase = new Case(
caseForDoc.id,
caseForDoc.caseNumber,
caseForDoc.caseStyle,
caseForDoc.baseType,
caseForDoc.status,
caseForDoc.fileDate,
caseForDoc.caseId,
caseForDoc.location);
}
myCase.documents[doc.id.toString()] = doc;
this.cart.cases.set(myCase.caseId, myCase);
this.cartJSON = JSON.stringify(this.cart);
this.shoppingCartService.updateCart(this.cart);
}
}
"例"是一个地图,在IShoppingCart中定义,看起来像这样:
export class ShoppingCart implements IShoppingCart {
public cases: Map<number, Case>; //Mapped to caseid
constructor(
public id: number,
public userIdentifier: string,
public emailAddress: string,
public convenienceFee: number,
public orderTotal: number,
) {
this.cases = new Map<number,Case>();
}
所有代码编译都很好。有什么想法吗?
编辑:在视图中调用addDocuments,如下所示:
<md-card ng-repeat="(docID, doc) in vm.case.documents" layout="column"
class="table-card" style="margin-top:0; margin-bottom:0; border-top:1px solid #ddd; border-bottom:1px solid #ddd;">
<md-card-content>
<div layout="row">
<div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
<tt-label-container>
<md-button class="md-primary md-hue-1" ng-click="vm.previewDoc($event)">
{{doc.documentName}}
</md-button>
</tt-label-container>
</div>
<div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
<tt-label-container>
<div>{{doc.date | date: 'MM/dd/yyyy'}}</div>
</tt-label-container>
</div>
<div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
<tt-label-container>
<div>{{doc.numberOfPages}}</div>
</tt-label-container>
</div>
<div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
<tt-label-container>
<div>{{doc.price | currency: '$'}}</div>
</tt-label-container>
</div>
<div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
<tt-label-container>
<div>
<md-button class="md-raised md-primary" ng-click='vm.addDocument(doc, vm.case)'>
<span>{{add.selected ? 'Remove' : 'Add'}}</span>
</md-button>
</div>
</tt-label-container>
</div>
</div>
</md-card-content>
</md-card>
答案 0 :(得分:0)
尝试执行此操作以检查案例属性是否真的是地图
this.cart = shoppingCartService.getCart();
console.log(this.cart.cases instanceof Map);
如果日志为“false”,您必须检查 shoppingCartService.getCart()如何获取购物车。我不能假设这种方法的实现,但我感觉你通过网络获得购物车并反序列化它。在运行时确保返回的对象和属性是否是您期望的属性(即使您明确键入结果变量)。
实际上你也可以检查
this.cart = shoppingCartService.getCart();
console.log(this.cart instanceof IShoppingCart);
你可能会对结果感到惊讶:)