2014-02-14 52 views
0

我目前正在處理其數據庫模式經常更改的應用程序。這種快速變化對我的前端Angular代碼產生了很大的問題,它通過Restangular消耗了後端JSON API(我沒有太多的控制權);採取下面的代碼,例如:是否有可能爲Angular模型屬性名稱進行映射?

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

會有很多像{{item.label}}在前端代碼隨處可見散落的模板標籤的,所以每當從,說「標籤」屬性名稱更改爲「ITEM_LABEL」我需要記住這些標籤的位置並更改所有標籤。當然,我可以做一個項目範圍廣泛的搜索和替換,但從DRY角度來看,這並不是很理想,這也是一個維護噩夢。

我的問題是,確實角(或Restangular)提供了一種像this in Backbone?

這樣模型的屬性名到自定義的地圖,我可以有這樣的事情

{ 
    label: model.item_label 
} 

那麼未來當「item_label」更改爲其他內容時,我可以在此配置對象中更新它,而不用擔心模板中的所有引用。

謝謝。

回答

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 
} 

所有這一切都可以在工廠中包裹起來。你可以編輯你的構造函數的屬性(一個地方(每個數據類型),唯一的地方)。雖然如果你使用諸如Restangular或$ resource之類的東西,這並不理想,因爲它們沒有裝備成爲一個大型的後備存儲,但它們只是假設了通過網絡的屬性,這對於大型的,變化中的應用程序有時可能難以管理。

+0

非常感謝,calebboyd!這聽起來像是一個很好的解決方案。但是,正如你上面提到的,它對於大型項目來說並不是很理想。請參閱我對最終解決方案的回答。 – user14412

0

我結束了與Restangular的setResponseExtractor配置屬性根據this FAQ answer

它看起來像這樣:

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