Javascript 构建丰富模型的良好实践

Javascript 构建丰富模型的良好实践,javascript,angularjs,architecture,model,restangular,Javascript,Angularjs,Architecture,Model,Restangular,我刚刚读过,解释了一种使用Angular/Restangular构建丰富模型的方法 本文展示了以下代码,这是一个通过restanglar检索所有建议的服务 angular.module('services', ['restangular']). factory('ProposalsSvc', function(Restangular) { Restangular.extendModel('proposals', function(obj) { return angular

我刚刚读过,解释了一种使用Angular/Restangular构建丰富模型的方法

本文展示了以下代码,这是一个通过restanglar检索所有
建议的服务

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('propositions');
。这样可以让更高层做出它需要的调用。
然而,这意味着控制器必须依赖于Restangular的api,这意味着实现细节。 此外,如果我需要一些转换器,比如转换结果中的一些日期,这将取决于我的控制器…丑陋。
我希望
工厂
控制器
意识到之前管理检索到的远程数据(一些转换等)

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


我是否应该创建一个中间层,另一个
工厂
,作为一个门面,隐藏控制器的实现?

您不必创建另一个工厂。调用
restanglar.all('ProposalsSvc')
返回一个具有get()方法的集合。因此您应该能够做到这一点:
ProposalsSvc.get(123)

或者您可以返回一个包含3个方法的服务:getList、one和post。然后您可以执行
ProposalsSvc.one().get(123)
。注意,多个()返回一个元素,而getList()返回一个
Promise
,因此服务的API不一致。我使用了一个用于简单模型的服务,但为了更大的灵活性,请使用集合

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