想象一下这样一种情况,您有一个查询数据库的数据服务。为了正常工作,您必须处理几个 $scope 变量:
$scope.trackerIds, //Array of objects
$scope.dateTo,
$scope.dateFrom,
最好的是: 1) 在 Controller 内计算一个值对象,然后将其传递给服务
例如:
var vo = {
trackers: _.map(trackersIds, function(trackerId, key){
return {
trackerId: trackerId,
geoip : $scope.trackers[trackerId].geoip
}
}),
dates:[$scope.dateFrom.toISOString(), $scope.dateTo.toISOString()],
}
var dataPromise = dataservice.getTracesBuckets(vo);
2) 或者直接将$scope发送到服务
var dataPromise = dataservice.getTracesBuckets($scope);
在第一种情况下, Controller 中将有逻辑来收集和排列 $scope 变量。 在第二种情况下,服务将耦合到 Controller ,因为他必须了解 $scope 结构才能调用正确的变量。
我处于“不那么有值(value)”的情况,所以我想知道我是否错过了一些重要的事情。感谢 Johnpapa Angular Style guide 我正在完全重建我的架构但对此没有任何帮助。
最佳答案
服务是无 View 组件, 将 View 模型传递给服务总是错误的......
您必须使用 Controller 在模型中转换 View 模型,然后在服务中使用模型(例如,通过ajax访问数据)...
更新: 根据 Angular 规范, Controller 是一个 BL 组件,与服务的区别在于,在 Controller 中我们必须放置 View 需要工作的唯一业务逻辑......在服务中,我们必须将所有无 View 的业务逻辑放在一起...换句话说, Controller 必须只在 View 模型中转换域模型,反之亦然!在您的示例中,您将 $scope 对象传递给服务,这样做是将服务与 View 链接起来,这是一个不好的做法,如果 $scope 发生变化,您也必须更改服务!使用Ctrl将vm变换为m
关于javascript - Angular 最佳实践 : pass a $scope to a service or pass a computed value object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33343741/