应该在$ scope附加什么方法?

时间:2017-01-09 04:04:36

标签: javascript angularjs mvvm angularjs-scope

我是AngularJS的新手,之前拥有WPF MVVM经验。现在,我对$ scope非常困惑,它看起来像是一个视图模型,我们可以在其上定义函数并使用ng-change,ng-click或其他一些角度指令来连接函数。但是如果该函数与UI无关,我们是否还应将它们附加到$ scope?我们应该在$ scope上定义哪些类型的函数?我还阅读了一些文章,建议使用服务来封装真实的实现,只需在$ scope的方法中调用服务,这可以解耦一些http调用。但我认为它会创造太多的服务,而且有些服务不会被重用。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用服务和工厂始终是解耦代码的好主意。 不要担心有两个很多服务。 您可以执行以下操作 -

1-创建处理休息呼叫的服务。任何休息呼叫都将使用此服务。该服务将采用数据,网址,方法等常用输入,并且对于整个应用中的所有控制器和服务都是通用的。

2-创建工厂作为实用目的。您可以进行一些计算并将适当的数据返回给控制器

3-使用常量存储全局变量,以便对这些变量进行任何更改都可以在一个地方完成。

4-某些服务将是自定义指令的特定服务,不会用于任何其他目的。

5- Scope可以有你的html访问的功能。其他功能可以是该控制器的私有功能。

答案 1 :(得分:1)

在$ scope中,您可以使用$ scope绑定方法和字段。$ eval()或$ scope。$ apply()(使用插值时使用隐含的方法:{{itIsInterpolation}}或ng-prefixed你的HTML代码中的属性)。 所以你可以考虑$ scope方法,比如: 这些方法可以从HTML层调用,仅此而已。

但是通过MVC意识形态,你使用控制器只是要求服务层执行一些逻辑操作,然后返回(渲染并放入$ scope)一些结果。这里一样。例如:



angular
  .module('myApp', [])
  .factory('ItemService', ItemService)
  .controller('ItemController', ItemController);

function ItemService($http) {
  return {
    getAllItemCost: getAllItemCost 
  };
  
  function getAllItemCost() {
    return $http.get('api/items)
      .then(function (response) {
        var items = response.data;
        return items.map(item => item.price).reduce((a, b) => a + b);
      });
  }
}

function ItemController(ItemService) {
  $scope.itemsCost = 0;
  
  $scope.updateItemsCost = function () {
    ItemService.getAllItemCost()
      .then(function (cost) {
        $scope.itemsCost = cost;
      });
  }
}