所以我现在开始在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
答案 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)和全部或大部分视图中使用此数据,我只会这样做。另外,要小心(!) - 如果数据是异步获取的,那么当控制器运行时它将无法使用。