假设我有一个 AngularJS 数据服务,它调用服务器并返回一个可以使用其他方法扩展的对象。例如,假设以下函数是 AngularJS 服务的一部分,用于类似 NerdDinner 的服务。
function getDinner(dinnerId) {
return $http.get('api/dinner/' + dinnerId)
.then(loadDinnerComplete)
.catch(loadDinnerFailed);
function loadDinnerComplete(response) {
return new Dinner(response.data);
}
}
一个地方定义 Dinner 类的最佳做法是什么?那是一个单独文件中的工厂吗?我是否在 NerdDinner 服务中定义它?或者我是否在 GetDinner 类中定义它(假设这是唯一可以创建晚餐的方法)?
我没有在 style guide 中找到任何关于创建对象的具体引用, 如果它被覆盖了,请原谅我,我只是错过了它。
编辑 我最终决定接受 Jeroen's answer因为它最符合我对一个相当简单的用例的需求。然而,Daniel's answer是纯金,不容忽视。如果我选择使用简单的 CRUD 或额外的基于服务器的操作来扩展我的 DTO 的功能,$resource 是一个很好的方法。
最佳答案
John Papa 的风格指南 (afaik) 中未明确提及放置业务实体(如 Dinner)的位置。
如果你想走这条路(使用业务实体并在那里放置逻辑),我应该给每个实体一个自己的工厂:
(function() {
'use strict';
angular
.module('myDinner')
.factory('Dinner', DinnerFactory);
function DinnerFactory() {
Dinner.prototype.eat = eat;
Dinner.prototype.cancel = cancel;
return Dinner;
// Constructor
function Dinner (data) {
// this is just an example:
this.time = data.time;
this.location = data.location;
}
// Methods
function eat() {
// ...
}
function cancel() {
// ...
}
}
})();
然后您可以将它们注入(inject)到您的 Controller 或其他服务对象中,只需使用 Dinner
,并使用 new Dinner(data) 创建一个新的
。Dinner
对象
您也可以使用服务,但 John Papa 不鼓励使用服务,因为它们与工厂太相似了。
关于javascript - 使用 John Papa 的 AngularJS 风格指南,声明数据对象的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34664383/