如何在角度2中为.map rxjs创建自定义函数

时间:2016-05-03 06:00:44

标签: javascript angular

我正在尝试使用angular 2创建一个应用程序,我有一个从API获取数据的服务,这是我的代码:

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





    }

}

但我有错误( angular2.dev.js:23925 EXCEPTION:TypeError:无法读取undefined的属性'length') 我想知道我的代码是真的吗?如果不是我怎么能创建一个函数来阻止一些响应的变化?

2 个答案:

答案 0 :(得分:1)

您需要在地图回调函数中产生副作用,如下所述:

  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
  }

答案 1 :(得分:0)

这里有几件事。

首先,您需要返回map回调:

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

然后你还需要在getEachInCategory方法中返回:

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