javascript - 使用 John Papa 的 AngularJS 风格指南,声明数据对象的正确方法是什么?

标签 javascript angularjs

假设我有一个 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/

相关文章:

javascript - 使用 jquery 设置 asp 下拉列表的选定值

javascript - 对象字面量属性赋值奇怪 : what's happening here?

javascript - puppeteer 选择链接

javascript - AngularJS 1.5 支持 Opera mini 吗?

angularjs - 单个 rest 'put' 端点是否足以用嵌套数组更新文档?

javascript - 如何从 View 中的域名中删除 "http://"

javascript - vue-google-maps - 如何设置 map 样式?

javascript - 滚动到溢出滚动 div 中的事件元素

php - 将 PHP 连接到 Cloud SQL

angularjs - 如何清除动态 ng-repeat 表单字段