2016-12-06 15 views
1

我使用$资源服务从宁静服务的数据访问。 $ resource(“path”)的结果我放入了typescript域对象。问题是,我得到的JSON形式是这样的:AngularJS自动映射从宁静服务的结果

{ 
    "name_surname": "john_smith", 
    "years_of_employment": "10" 
} 

,我想它映射到这个类的域对象:

class Employee { 
    constructor(public FullName: string, public YearsOfEmployment: number) { } 
} 

所以有域类中属性的名称之间的错配和json字段。有没有我可以用于这两个之间的映射的任何angularjs模块,什么是最优雅的方式来实现呢?

回答

0

我在我的一个项目中使用了它。 它将缩短的属性映射为可读属性以进行开发。 也许这个片段可以帮助你。

(function (angular) { 
    "use strict"; 

    angular.module("services.mapper", []).service("mapper", [function()  { 
     var models = { 
      employeeModelContract: { 
       name_surname: "FullName", 
       years_of_employment: "YearsOfEmployment" 
      } 
     }; 

     return { 
      map: map, 
      models: models 
     } 

     function map(smallObject, contract) { 
      var largeObject = {}; 
      for (var smallProperty in contract) { 
       if (contract.hasOwnProperty(smallProperty)) { 
        largeObject[contract[smallProperty]] = smallObject[smallProperty]; 
       } 
      } 
      return largeObject; 
     } 
    }]); 
})(angular); 

用法:

var mappedObject = mapper.map(yourJson, mapper.models.employeeModelContract); 

更新1(打字稿版):

class MapperService implements ng.IServiceProvider { 

    employeeModelContract:Object= { 
     name_surname: "FullName", 
     years_of_employment: "YearsOfEmployment" 
    }; 

    $get() { 
     return this; 
    } 

    map(smallObject, contract): Object { 
     var mappedObject: Object = {}; 
     Object.keys(contract).forEach(contractProperty => { 
      if (contract.hasOwnProperty(contractProperty)) { 
       mappedObject[contract[contractProperty]] = smallObject[contractProperty]; 
      } 
     }); 
     return mappedObject; 
    } 
} 

class Employee { 
    constructor(public FullName: string, public YearsOfEmployment: number) { } 
} 

class Controller implements ng.IController { 

    constructor(private mapper : MapperService){} 

    static $inject = ["MapperService"]; 

    json: Object = { 
     "name_surname": "john_smith", 
     "years_of_employment": "10" 
    } 

    $onInit(): void { 
     var mapped = <Employee>this.mapper.map(this.json, this.mapper.employeeModelContract); 
    } 
} 

angular.module("mapper", []).controller("Controller",Controller).provider("MapperService", MapperService); 
+0

由于我使用打字稿,我找的打字稿映射器,而不是纯JavaScript。 – bambi

+0

我已经更新了我的答案。也许这可以帮助你。 – Danscho

+0

我已经延长我的回答并修正了错误。 – Danscho