111*_*110 6 javascript angularjs angularjs-scope
我仍在学习angularjs,我有理解$scope与model对象之间的区别的问题,这目前阻止我组织(使用一些最佳实践)我的应用程序.
据我所知$scope应该只读(看了一些我听到的教程).
因此,当我加载应用程序时,我应该使用service从数据库中获取一些数据并将其存储model.
更新
现在我从服务器获得的所有数据都存储在控制器$ scope中,我正在尝试将其移动到服务并使控制器变为dumber.
我也检查了这篇文章,我试图使用第二个或第三个选项,但仍然无法找到实现它的最佳方法.
这是我的服务和控制器:
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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
但是在这个实现中,列表再次出现在控制器中.
我从服务器和应该从服务器(从控制器或服务)获取此列表之后应该在哪里存储此列表,以便我可以以缓存的方式操作此列表(保持本地并偶尔更新它)?
我来自C#world,在那里我总是使用实体对象(例如User,Product,Item等)在循环中填充这些对象并将其存储在列表中.我无法找到一种方法,我应该如何在角度中使用这种方法,如果是,那应该是仅具有属性的服务吗?
我使用一个服务来保持列表,一个服务包含CRUD函数.如果我$scope从我的模型中加载数据,如果代码的其他部分在我的模型中更改数据,如何更新该范围?
更改可以来自另一个控制器,也可以通过SignalR进行更新.另外正如我所说,我在视图上更新数据$scope应该是readonly我需要更新服务,然后又如何以及何时更新$scope呢?
我很抱歉,如果我的问题太过正常,但如果有人可以帮助我了解哪里保持角度,我会感激不尽?
该模型更常用于名为 Model\xe2\x80\x93view\xe2\x80\x93controller (MVC) 的软件架构模式中。如果不了解完整模式,您就无法理解模型的工作原理。在此模式中,Web 应用程序被分成多个组件,目的是分离职责。我将指导您使用完整的 TODO 代码示例来了解 MVC 的真正用途。\n
模型:获取/操作所有域数据(更常见的是从服务器获取)。在这里,您创建一个清晰的 API,可以访问服务中发生的数据。在服务中,您从服务器获取数据,将它们保存在内部,然后提供一些提供访问权限的功能,当有人需要这些数据时,他只需使用注入来访问服务。将这种服务视为具有数据、获取/设置和其他方法的单例类。一条规则是:如果您不知道某件事要去哪里,则更有可能去服务。(完整代码)
\n\n.factory(\'api\', function ($resource) {\n \'use strict\';\n\n var store = {\n //HERE IS THE API\n todos: [],\n\n api: $resource(\'/api/todos/:id\', null,\n {\n update: { method:\'PUT\' }\n }\n ),\n clearCompleted: function ()[..]\n delete: function (todo)[..]\n get: function () [..]\n insert: function (todo)[..] \n put: function (todo)[..]\n };\n return store;\n})\nRun Code Online (Sandbox Code Playgroud)\n\n控制器:在上图中,您可以很容易地看到控制器仅从用户交互中获取而不给出。控制器不操纵 Dom。这里的数据通过使用范围(或this在控制器内部使用)从视图(用户)到控制器,然后使用我们通过注入服务(模型)获得的函数来操作模型。很多时候我们让控制器充当中介,这打破了MVC的规则,通过查询模型并将结果传递给视图,这就是不同的模式名称MVP。规则是:您的控制器必须始终尽可能精简。(完整代码)
.controller(\'TodoCtrl\', function TodoCtrl($scope, $routeParams, $filter, store) {\n //store is the model, we make this in app.js\n //is the result of a factory we make up,and we named "api"\n var todos = $scope.todos = store.todos;\n [..]\n //in html we call removeTODO\n //<button class="destroy" ng-click="removeTodo(todo)"></button>\n //We use user interaction to manipulate the model!\n $scope.removeTodo = function (todo) {\n store.delete(todo);//we use the api we make\n };\n [..]\nRun Code Online (Sandbox Code Playgroud)\n\n视图:如图所示,模型更新视图,而不是控制器。如何?带有指令和过滤器。请注意,视图仅具有数据的表示(数据绑定)。不要包含复杂的逻辑。我想明确的是,在 MVC 中视图应该直接访问模型。指令和过滤器提供此功能。如果你想进行 DOM 操作,你必须使用指令(而不是控制器)。注意:我们将 dom 操作放在指令的编译和链接函数中,而不是在控制器中。( FULL CODE1 FULL CODE2 )
\n\n\n\n\n我无法理解 $scope 和 model\n 对象之间的区别
\n
范围只是指我们看到的模型,但不是模型!范围也用于用户交互,控制器取决于范围,控制器取决于模型。
\n\n\n\n\n所以我可以以缓存的方式操作这个列表(将其保留在本地并偶尔更新它)?
\n
有很多方法可以解决这个问题。通常我们使用观察者模式,但在 Angular 中,有另一种方法可以做到这一点,在大多数情况下效果更好。这里有一个例子:
\n\nangular\n .module("testApp", [])\n .service("myDataService", function(){\n this.dataContainer = {\n valA : "car",\n valB : "bike"\n }\n })\n .controller("testCtrl", [\n "$scope",\n "myDataService",\n function($scope, myDataService){\n $scope.data = function(){\n //you get always the update data and never store tha data\n //to the controller\n return myDataService.dataContainer;\n };\n }]);\nRun Code Online (Sandbox Code Playgroud)\n\n欲了解更多信息,请检查此,有一些令人惊奇的答案。
\n