【问题标题】:Good practice to build a rich model构建丰富模型的良好实践
【发布时间】:2014-12-08 10:44:40
【问题描述】:

我刚刚阅读了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") 的具体提案。
你会告诉我:“逻辑,因为ProposalsSvc 中的“提案”末尾有一个“s”。

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

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

我是否应该创建一个中间层,另一个 factory,充当外观,将实现隐藏到控制器?

【问题讨论】:

    标签: javascript angularjs architecture model restangular


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 2021-11-26
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多