【发布时间】:2016-08-25 15:33:17
【问题描述】:
我仍在学习 angularjs,但我无法理解 $scope 和 model 对象之间的区别,这目前阻止我组织(使用一些最佳实践)我的应用程序。
据我了解,$scope 应该是只读的(观看了一些我听说过的教程)。
因此,当我加载应用程序时,我应该使用 service 从数据库中获取一些数据并将其存储在 model 中。
更新
现在,我从服务器获取的所有数据都存储在控制器 $scope 中,我正试图将其移至服务并让控制器变得更笨。
我还检查了这个article,我正在尝试使用第二个或第三个选项,但仍然找不到实现它的最佳方法。
这是我的服务和控制器:
function dataService($http) {
var service = {
getToDoList: getToDoList,
getToDoListByType: getToDoListByType,
getToDoById: getToDoById
};
return service;
function getToDoList() { }
function getToDoListByType() { }
function getToDoById() { }
}
function toDoController($location) {
var vm = this;
vm.todos = [];
vm.title = 'toDoController';
activate();
function activate() {
return getToDos().then(function () {
console.log("ToDos loaded");
});
}
function getToDos() {
return dataservice.getToDoList()
.then(function (data) {
vm.todos = data;
return vm.todos;
});
}
}
但在此实现中,待办事项列表再次位于控制器中。
从服务器获取此列表以及应从何处设置(从控制器或从服务)后,我应该将其存储在哪里,以便我可以以缓存的方式操作此列表(将其保留在本地并偶尔更新它)?
我来自 C# 世界,在那里我总是使用实体对象(例如用户、产品、项目等)在循环中填充这些对象并将其存储在列表中。我也找不到一种方法,我应该如何在 Angular 中使用这种方法,如果是,那应该是仅具有属性的服务吗?
我使用一项服务来保存列表,并使用一项服务来包含 CRUD 功能。
如果我从模型加载 $scope 中的数据,如果代码的其他部分更改模型中的数据,如何稍后更新该范围?
例如,更改可以来自另一个控制器或通过 SignalR 进行更新。
另外,当我更新视图上的数据时,我听说$scope 应该是只读的,我需要更新服务以及如何以及何时更新$scope?
如果我的问题太菜鸟,我很抱歉,但如果有人能帮助我了解在哪里保留有角度的内容,我将不胜感激?
【问题讨论】:
-
在某些时候,ToDo 列表必须在控制器中,否则您将无法绑定到它。您要抽象出的是触及服务的操作,因此如果服务器实现发生更改,您只需要更改数据服务,而不是控制器。它还有助于单元测试,因为您可以制作模拟数据服务来返回假数据。在编写任何服务器代码之前,我也会为原型设计做同样的事情。
-
在问题示例中,我创建了一个抽象服务器调用的服务。我将举另一个例子:
Service gets the list>return list to controller $scope>display it on view=> 但现在在视图中,我通过向需要添加的每个项目(分组、着色等)添加一些属性来操作项目中的数组为了显示这些数据。假设我不想再次更改所有这些属性(再次运行循环),但我需要从服务器获得的原始数据。但是当我将列表返回给控制器时,我不再有原始数组了。 -
因为我不想再次调用服务器,所以我不知道什么是好的做法 - 在哪里保留该模型。
-
保留你的模型:@C.C.回答。像 angularCache 这样的模块有一些缓存来处理数据过期等等。 sessionStorage 用于最近的浏览器。所有这些元素都必须在 Service 层使用。
标签: javascript angularjs angularjs-scope