我目前正在处理其数据库架构经常更改的应用。这种快速变化为我的前端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”更改为其他内容时,我可以在此配置对象中更新它,而不用担心模板中的所有引用。
感谢。
答案 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 answer的setResponseExtractor
配置属性。
看起来像这样:
Restangular.setResponseExtractor(function(response, operation, what, url) {
var newResponse = response;
angular.forEach(newResponse.items, function(item) {
item.label = item.item_label;
}
return newResponse;
}