2016-05-03 6 views
0

schaffen I mit Winkel 2 eine Anwendung zu erstellen, ich versuche, habe ich einen Dienst, der Daten aus einer API und diesen meinen Code zu holen:, wie eine benutzerdefinierte Funktion für .map rxjs in Winkel 2

import {Http} from "angular2/http"; 
import {Injectable} from 'angular2/core'; 
import "rxjs/add/operator/map"; 

declare var website : any; 
declare var jQuery : any; 

@Injectable() 
export class categoryService{ 

    private _url = website + "/api/category/list"; 
    private category = []; 
    constructor (private _http : Http){ 



    } 

    getCategory(){ 

     return this._http.get(this._url) 
      .map(res => { 

       this.getEachInCategory(res.result); <==== i want impelement some changes in response 

      }); 

    } 
    getEachInCategory(data){ 



     jQuery.each(data, function(index, value) { 


      var test = []; 
      jQuery.each(value , function (index2 , value2) { 

       var obj = {}; 
       obj["name"] = index2; 

       if(typeof value2["_props"] !== "undefined"){ 
        obj["title"] = value2._props.title; 
       } 

       var subs = []; 
       jQuery.each(value2 , function (index3 , value3) { 

        var obj_subsub = {}; 
        obj_subsub["name"] = index3; 
        if(typeof value3["_props"] !== "undefined"){ 

         obj_subsub["title"] = value3._props.title; 


        } 

        subs.push(obj_subsub); 


       }); 
       obj["items"] = subs; 
       test.push(obj); 

      }); 

      var item = {}; 
      item["name"] = index ; 
      item["items"] = test ; 
      item["title"] = value._props.title; 
      this.category.push(item); 




     }.bind(this)); 





    } 

} 

aber ich habe einen Fehler ( angular2.dev.js: 23925 EXCEPTION: TypeError: Kann Eigenschaft 'Länge' von undefined nicht lesen) Ich möchte wissen, dass mein Code wahr ist, wenn nicht, wie ich eine Funktion erstellen kann, um etwas zu ändern Antwort?

+0

Können Sie uns zeigen, was Sie empfangen Ergebnis? – yurzui

+0

meine Antwort ist ein JSON und Ergebnis ist ein Objekt ... Diese Funktion ist perfekt innerhalb jeder Komponente, die die Antwort reseded aber ich möchte, dass mein Code klar werden ... –

+0

Sie haben keine Nebenwirkung in Ihrer Karte Rückruf Funktion – yurzui

Antwort

1

Sie benötigen einen Nebeneffekt in der Karte Callback-Funktion haben, wie unten beschrieben:

getCategory(){ 
    return this._http.get(this._url) 
     .map(res => this.getEachInCategory(res.result)); 

    } 
    getEachInCategory(data){ 
    return something; // for example you can use here reduce method 
    } 
0

Es gibt hier mehrere Dinge.

Zuerst müssen Sie in der map Rückruf zurück:

return this._http.get(this._url) 
     .map(res => { 
     return this.getEachInCategory(res.json()); 
     }); 

Dann kehren Sie müssen auch in der getEachInCategory Methode:

getEachInCategory(data) { 
    var categories = []; 

    jQuery.each(data, (index, value) => { 
    var test = []; 
    jQuery.each(value , (index2 , value2) => { 
     var obj = {}; 
     obj["name"] = index2; 

     if(typeof value2["_props"] !== "undefined") { 
     obj["title"] = value2._props.title; 
     } 

     var subs = []; 
     jQuery.each(value2 , (index3 , value3) => { 
     var obj_subsub = {}; 
     obj_subsub["name"] = index3; 
     if(typeof value3["_props"] !== "undefined") { 
      obj_subsub["title"] = value3._props.title; 
     } 
     subs.push(obj_subsub); 
     }); 

     obj["items"] = subs; 
     test.push(obj); 
    }); 

    var item = {}; 
    item["name"] = index ; 
    item["items"] = test ; 
    item["title"] = value._props.title; 
    categories.push(item); 
    }); 

    return categories; 
} 
+1

Das jquery obwohl – nick

+1

Ja, einverstanden! Dies könnte mit 'Array.forEach' geschehen anstatt ;-) –

+0

ich kopiere deinen Code und ersetze ihn mit meinem Code, aber funktioniert nicht ... Fehler: angular2.dev.js: 23925 AUSNAHME: TypeError: Eigenschaft 'length' kann nicht gelesen werden 'von undefined bei MapSubscriber.Subscriber.next (http://127.0.0.1:3000/node_modules/rxjs/bundles/Rx.js:10667:14) –