是否可以为Angular模型属性名称设置映射?

时间:2014-02-14 00:21:39

标签: javascript angularjs angularjs-ng-repeat restangular

我目前正在处理其数据库架构经常更改的应用。这种快速变化为我的前端Angular代码带来了一个大问题,它通过Restangular消耗后端JSON API(我没有太多的控制权);以下面的代码为例:

<ul>
    <li ng-repeat="item in items">
        <h2>{{item.label}}</h2>
    </li>
</ul>

前端代码中会有很多像{{item.label}}分散的模板标签,所以每当属性名称发生变化时,比如说“label”到“item_label”,我都需要记住这些标签是并改变所有标签。当然,我可以进行项目范围内的搜索和替换,但从DRY的角度来看这并不是很理想,它也将是一个维护噩梦。

我的问题是,Angular(或Restangular)是否提供了将模型属性名称映射到自定义属性名称的方法,如this in Backbone?

这样,我可以有这样的东西

{
    label: model.item_label
}

然后下次将“item_label”更改为其他内容时,我可以在此配置对象中更新它,而不用担心模板中的所有引用。

感谢。

2 个答案:

答案 0 :(得分:1)

角度的想法是你可以用模型做任何你想做的事情。虽然这并没有指出您的任何具体方向,但它确实为您提供了以您自己的OO方式实现它的机会。假设您的应用程序具有名为... Task的数据对象,则任务的模型可能看起来像......

function Task(initJson){
    this.name = initJson._name || 'New Task';
    this.completed = initJson.is_completed || false;
    this.doneDateTime = initJson.datetime || null;        
}

Task.prototype = {
    save: function(){
        //do stuff with this and $http.put/post...        
    }
    create: function(){
        //do stuff with this and $http.put/post
    }
    //....etc
}

所有这些可能都包含在工厂里。

myApp.factory('TaskFactory',function($http){
    var Tasks = []; //Or {};

    //above constructor function...
    //other helper methods...etc



    return {
        instance: Task,
        collection: Tasks,            
        init: function(){} // get all tasks? run them through the constructor (Task), populate collection
    };
})

然后,您可以在构造函数上编辑属性(一个位置(对于每种数据类型),唯一的位置)。虽然如果你使用像Restangular或$ resource这样的东西,因为它们没有成为一个大型的后备存储,但是它们只是假设有线的属性,这对于大型的,不断变化的应用程序有时很难管理,这并不理想。

答案 1 :(得分:0)

我最终使用Restangular的基于this FAQ answersetResponseExtractor配置属性。

看起来像这样:

Restangular.setResponseExtractor(function(response, operation, what, url) {
    var newResponse = response;
    angular.forEach(newResponse.items, function(item) {
        item.label = item.item_label;
    }
    return newResponse;
}