使用AngularJS设计应用程序逻辑

时间:2014-11-07 23:48:19

标签: angularjs

所以我现在开始在AngularJS中创建我的第一个应用程序,我在解决如何为我的特定应用程序应用模块,工厂和服务等组件时遇到了一些麻烦。

在我看到的教程中,为简单起见,服务中$http收集的数据已准备好$scope。我的意思是"范围准备好"控制器可以直接调用服务并将输出直接放入范围而无需任何修改。

但是,在我的应用程序中,将通过$http检索的数据采用任意json格式Data1,并且需要在它之前将其转换为任意json格式Data2可以放入$scope。转换后,不再需要格式为Data1的数据。然后,用户对数据进行更改(格式为Data2),并在完成后单击提交按钮。然后将数据从格式Data2转换回格式Data1并发送回服务器。这种在数据格式之间进行转换的过程我认为"大脑"我的应用程序,如果我在vanilla JavaScript中编写它将需要多个函数(不知道如何转换为AngularJS)。

所以我的第一个问题是,我将在哪里进行数据格式转换,前进和后退?我应该把它们放在服务,工厂,模块,控制器等中吗?我的猜测是我会将数据格式之间的转换放在服务中,但我不确定。

为了使事情变得更复杂,我的应用程序的数据只需要获取一次(作为数据格式Data1),然后在多个视图中使用(作为数据格式Data2)。从阅读this question and its suggested answer开始,我认为最好的选择是使用$rootScope来存储我的数据(格式为Data2)。所以我的第二个问题是,我如何独立于任何特定视图将我的数据导入$rootScope,因此它只在应用程序初始化时运行一次? (我知道如何使用上述按钮完成反向过程。)

如果我没有很好地解释自己,请告诉我,我会尽力澄清。

谢谢JamesStewy

1 个答案:

答案 0 :(得分:0)

让我们先将术语对齐 - 它可能会简化事情。

就控制器而言,

工厂服务是相同的。唯一的区别在于它们的创建,但这是在它们被注入控制器之前发生的。

模块类似于包或功能容器。所以,就这个问题而言,它们并不重要。

模型是表示后端数据层的数据(及相关功能)的对象。

ViewModels 是View使用和修改的对象。这就是您所说的“范围就绪”。

控制器负责处理来自View的调用(例如ng-click)以及用于在模型和ViewModel之间封送数据(通常通过服务)。保持控制器尽可能精益是一种很好的做法。

所以这就是你需要做出判断的地方。这种转换是否与业务逻辑无关?此转换是否特定于单个控制器?这种转换是否简短易读?如果上面的答案为否,那么您应该将此逻辑放在服务中。服务用于封装后端/业务逻辑或更简单的前端逻辑。

至于您的第二个问题,我建议让服务获取并将数据缓存在本地服务变量中。服务是单例,因此每个控制器都会获得相同的实例。

app.service("myService", function($http){
  function myService {
     var promise = null;
     this.get = function(){ 
        if (!promise){
           promise = $http(url);
        }
        return promise;
     }
  }
});

app.controller("ctrl1", function($scope, myService){
   myService.get().then(data){
      $scope.items = data;
   }
});

可以使用$rootScope - 并将数据存储在.run块中。但是,如果要在视图(即HTML)和全部或大部分视图中使用此数据,我只会这样做。另外,要小心(!) - 如果数据是异步获取的,那么当控制器运行时它将无法使用。