当前位置:  开发笔记 > 编程语言 > 正文

使用John Papa的AngularJS样式指南,声明数据对象的正确方法是什么?

如何解决《使用JohnPapa的AngularJS样式指南,声明数据对象的正确方法是什么?》经验,为你挑选了1个好方法。

假设我有一个AngularJS数据服务,它调用服务器并返回一个可以使用其他方法扩展的对象.例如,假设以下函数是NerdDinner之类的AngularJS服务的一部分.

function getDinner(dinnerId) {
   return $http.get('api/dinner/' + dinnerId)
      .then(loadDinnerComplete)
      .catch(loadDinnerFailed);

   function loadDinnerComplete(response) {
      return new Dinner(response.data);
   }
}

一个地方定义晚餐课的最佳做法是什么?这是一个单独的文件工厂吗?我在NerdDinner服务中定义了吗?或者我在GetDinner类中定义它(假设这是唯一可以创建晚餐的方法)?

我没有找到任何具体的参考在风格指南中创建对象,所以请原谅我,如果它被覆盖,我只是错过了它.

编辑 我最终决定接受Jeroen的答案,因为它最符合我对一个相当简单的用例的需求.然而,丹尼尔的回答是纯金,不应该被忽视.如果我选择使用简单的CRUD或其他基于服务器的操作来扩展DTO的功能,那么$ resource是一种很好的方法.



1> Jeroen Noten..:

在John Papa的风格指南(afaik)中没有明确提到商业实体(如晚餐)的位置.

如果你想走这条路(使用商业实体并在那里放置逻辑),我应该为每个实体提供自己的工厂:

(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() {
      // ...
    }

  }

})();

然后,您可以将它们注入您的控制器或其他服务对象,只需使用Dinner,然后使用创建新Dinner对象new Dinner(data).

您也可以使用服务,但John Papa不鼓励服务,因为它们与工厂太相似.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有