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