2017-06-29 1 views
0

Lorsque vous essayez de faire une recherche clé/valeur sur une carte dans mon contrôleur dactylographiée, je reçois l'erreur suivante:RECEVANT « TypeError: this.cart.cases.get est pas une fonction », même si la fonction existe

TypeError: this.cart.cases.get is not a function

Cependant, « get » est certainement défini pour une carte Tapuscrit. Le contrôleur appelant ressemble à ceci:

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

"cas" est une carte, qui est défini dans IShoppingCart, qui lookslike ceci:

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

Tout le code compile bien. Des idées?

EDIT: Les addDocuments est appelé dans une vue, dans la partie ci-dessous:

<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

Qui appelle 'addDocument'? –

Répondre

0

Essayez de le faire pour vérifier si vos cas propriété est vraiment une Carte

this.cart = shoppingCartService.getCart(); 
console.log(this.cart.cases instanceof Map); 

Si le journal est « false » vous devez vérifier comment shoppingCartService.getCart() devient le chariot. Je ne peux pas assumer la mise en œuvre de cette méthode, mais j'ai l'impression que vous obtenez le panier à travers le réseau et le désérialiser. Assurez-vous au moment de l'exécution si l'objet retourné et les propriétés qui lui appartiennent sont réellement ceux que vous attendez (même si vous tapez explicitement la variable résultat).

En fait, vous pouvez également vérifier

this.cart = shoppingCartService.getCart();  
console.log(this.cart instanceof IShoppingCart); 

Vous pourriez être surpris du résultat :)

+0

La suggestion de console.log() était la clé exacte pour trouver le problème. Dans la méthode getCases(), le ShoppingCart a été désérialisé à partir d'un cookie (ng-cookies) et lu dans le fichier this.cart. Le problème était que lorsque l'objet ShoppingCart était placé dans le cookie en premier lieu, la carte était sérialisée en JSON comme un tableau associatif simple, sans les méthodes get/put de la classe Map. Donc à l'exécution, je n'avais pas du tout affaire à une carte! –