Dictionary “接收”;TypeError:this.cart.cases.get不是函数";即使函数存在
尝试在Typescript控制器中的映射上执行键/值查找时,我收到以下错误: TypeError:this.cart.cases.get不是函数 然而,“get”是为Typescript映射定义的。调用的控制器如下所示:Dictionary “接收”;TypeError:this.cart.cases.get不是函数";即使函数存在,dictionary,typescript,typeerror,Dictionary,Typescript,Typeerror,尝试在Typescript控制器中的映射上执行键/值查找时,我收到以下错误: TypeError:this.cart.cases.get不是函数 然而,“get”是为Typescript映射定义的。调用的控制器如下所示: export class CaseController{ case: Case; cart: IShoppingCart; constructor( private $location: ng.ILocationService,
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);
}
}
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>();
}
“案例”是一个地图,在IShoppingCart中定义,如下所示:
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);
}
}
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>();
}
导出类ShoppingCart实现了IShoppingCart{
公共案例:Map;//映射到caseid
建造师(
公众id:号码,
公共用户标识符:字符串,
公共电子邮件地址:string,
公共设施费:号码,
公共秩序总数:,
) {
this.cases=newmap();
}
所有的代码都编译得很好,有什么想法吗
编辑:在视图中调用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>
{{doc.documentName}
{{doc.date}日期:'MM/dd/yyyy'}
{{doc.numberOfPages}
{{doc.price}货币:'$'}
{{add.selected?'Remove':'add'}}
尝试这样做,以检查您的cases属性是否真的是一个映射
this.cart = shoppingCartService.getCart();
console.log(this.cart.cases instanceof Map);
如果日志为“false”,则必须检查shoppingCartService.getCart()如何获取购物车。我无法假设此方法的实现,但我感觉您通过网络获取购物车并对其进行反序列化。请确保在运行时返回的对象和所属属性是否确实是您所期望的(即使显式键入结果变量)
其实你也可以查一下
this.cart = shoppingCartService.getCart();
console.log(this.cart instanceof IShoppingCart);
您可能会对结果感到惊讶:)谁在调用
addDocument
?console.log()建议正是找到问题的关键。在getCases()方法中,ShoppingCart是从cookie(ng cookies)反序列化的然后读入this.cart。问题是,当ShoppingCart对象首先放入cookie时,映射作为简单的关联数组序列化为JSON,没有任何Map类的get/put方法。所以在运行时,我根本没有处理映射!