javascript - Angular 最佳实践 : pass a $scope to a service or pass a computed value object?

标签 javascript angularjs

想象一下这样一种情况,您有一个查询数据库的数据服务。为了正常工作,您必须处理几个 $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/

相关文章:

javascript - 如何在javaScript中保留两位小数

javascript - 表达中间件困惑

javascript - 在 JavaScript 中呈现大型列表

javascript - 表单验证不验证密码

angularjs - AngularJS:如何仅在字符串超出限制时使用limitTo来显示椭圆

javascript - 如何使用下划线返回对象作为 groupby 函数中的键

javascript - 为什么将 AngularJS 指令限制为类是不好的?

javascript - ivh 树 - 禁用节点选择

javascript - 数据未传递给 api 调用

javascript - 如何在没有设置宽度的情况下更改内容时防止按钮缩小?