2013-08-18 13 views
8

當你有一個JSON $資源時,你如何將結果對象轉換成更具體的對象?例如,現在它們以對象數組的形式返回,但我希望它們以「約會」對象的數組形式返回,以便我可以在該約會對象上有一些方法來解答有關該約會對象。例如:這個預約是否有與之相關的服務?這是在早上還是下午的約會?AngularJS自定義模型對象的方法?

起初我以爲transformResponse鉤子可以從ngResource中工作,但這似乎不起作用。從這個回報不是實際的對象。似乎用這個函數你只能修改JSON解析之前的實際數據。

最後,我質疑這是否是一個合適的angularJS技術?或者這些輔助方法是否應該顯示在控制器或其他模塊中,並接受對象的工作?我只是認爲它更清潔,讓它們包裹在對象中,但我承認我對angularJS不是很有經驗。

回答

22

如果您使用的是工廠,要添加例如,您可以將功能添加到返回的項目的原型(DEMO)功能:

app.factory('Appointment', ['$resource', function($resource) { 
    var Item = $resource('appointments.json',{/*bindings*/},{/*actions*/}); 

    Item.prototype.hasServices = function() { 
    if(this.services.length > 0) return true; 
    else return false; 
    }; 

    Item.prototype.partOfDay = function() { 
    if(this.time.split(':')[0] > 12) return "afternoon"; 
    else return "morning"; 
    }; 

    return Item; 

}]); 

,然後訪問它在你的資源控制器:

$scope.appointments = Appointment.query({}, function() { 
    console.log($scope.appointments[0].partOfDay()) 
}); 
在視圖

或者直接內部例如是NG-重複:

{{appointment.partOfDay()}} 

要回答你最後的問題,我認爲上述解決方案是一個合適的angularjs技術。 只要您的函數與特定的資源類型相關聯,我認爲最好直接將它們附加到相應的資源對象。爲什麼要在控制器中創建輔助函數?當您必須將資源作爲參數傳遞時,此外,這些函數可以在多個控制器或範圍中使用?

+1

感謝Plunker的例子。我想我並不真正瞭解當您從JSON服務中獲取數組時,$資源是如何工作的。當我調試的東西,它仍然設置一個「資源」對象,但我假設一旦實際獲得,它會以某種方式設置爲約會對象?我有它的工作,但只是想了解我是如何得到它的工作。 –

+1

工廠只叫Appointment,它返回一個標準資源對象,並在其原型中增加了附加功能。 –

+1

它基本上與您在普通js中編寫一個名爲Appointment的基本函數相同,該函數返回具有某些屬性的對象。這與請求的json本身沒有多大關係。一旦ajax請求完成,結果將被附加到資源對象。 –

相關問題