建立丰富模型的良好做法

时间:2014-10-13 19:15:28

标签: javascript angularjs architecture model restangular

我刚刚阅读this,解释了使用Angular / Restangular构建丰富模型的方法。

本文展示了以下代码,一个服务通过Restangular检索所有proposals

angular.module('services', ['restangular']).
  factory('ProposalsSvc', function(Restangular) {
    Restangular.extendModel('proposals', function(obj) {
      return angular.extend(obj, {
        profit: function() {
          return this.revenue().minus(this.cost());
        },
        revenue: function() {
          return this.price().
            convertTo(this.internalCurrency);
        },
        cost: function() {
          return this.recurringEngineering.cost().plus(
            this.nonRecurringEngineering.cost()
          );
        }
        ...
      });
    });

    return Restangular.all('proposals');
  });

我的问题是:

如果我想要检索特定提案:/proposals/123应该创建另一个工厂 => ProposalSvc .....?
实际上,上面这一项特别返回Restangular.all ...,无法使用Restangular.one("123")返回特定提案。
你会告诉我:"逻辑,因为有一个" s"在#34;提案"结束时在ProposalsSvc

我想到了返回Restangular.service('proposals');的方法。那会让更高层进行所需的通话 但是,它意味着控制器必须依赖于Restangular的api,这意味着实现细节。 此外,如果我需要一些转换器,比如在结果中转换一些日期,那将取决于我的控制器...丑陋 我希望factorycontroller知道它们之前管理检索到的远程数据(某些转换等)。

管理CRUD的好方法是什么,同时避免将所有逻辑放在controller

我应该创建一个中间层,另一个factory作为外观,将实现隐藏到控制器吗?

1 个答案:

答案 0 :(得分:0)

您不必创建另一家工厂。对Restangular.all('proposals')的调用返回一个具有get()方法的Collection。所以你应该能够做到这一点:ProposalsSvc.get(123)

或者你可以返回一个有3种方法的服务:getList,one和post。然后,您可以ProposalsSvc.one().get(123)。注意,一个()返回一个元素,而getList()返回一个Promise<array>,因此服务的API不一致。我已将服务用于简单模型,但为了更灵活,请使用Collection。

如果您不想将Restangular注入控制器以执行转换等操作,那么服务外观可能是一个好主意。