构建丰富模式的良好实践

Good practice to build a rich model

本文关键字:模式 构建      更新时间:2023-09-26

我刚刚读到这篇文章,解释了用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。。。,不能返回具有CCD_ 5的特定提议
你可以告诉我:"逻辑,因为ProposalsSvc.中的"提案"末尾有一个"s"

我考虑了返回Restangular.service('proposals');的方法。这将让更高层做出它需要的调用
然而,这意味着控制器必须依赖于Restangular的api,也就是实现细节。此外,如果我需要一些转换器,比如在结果中转换一些日期,这将取决于我的控制器。。。丑陋
我希望factorycontroller意识到之前管理检索到的远程数据(一些转换等)。

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

我应该创建一个中间层,另一个factory,作为门面,向控制器隐藏实现吗?

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

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

如果您不想将Restangular注入到控制器中以进行转换之类的操作,那么服务外观可能是个好主意。