在angularJS应用程序中保留模型的位置?

111*_*110 6 javascript angularjs angularjs-scope

我仍在学习angularjs,我有理解$scopemodel对象之间的区别的问题,这目前阻止我组织(使用一些最佳实践)我的应用程序.
据我所知$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呢?

我很抱歉,如果我的问题太过正常,但如果有人可以帮助我了解哪里保持角度,我会感激不尽?

Tho*_*tos 4

该模型更常用于名为 Model\xe2\x80\x93view\xe2\x80\x93controller (MVC) 的软件架构模式中。如果不了解完整模式,您就无法理解模型的工作原理。在此模式中,Web 应用程序被分成多个组件,目的是分离职责。我将指导您使用完整的 TODO 代码示例来了解 MVC 的真正用途。\n在此输入图像描述

\n\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})\n
Run Code Online (Sandbox Code Playgroud)\n\n

控制器:在上图中,您可以很容易地看到控制器仅从用户交互中获取而不给出。控制器不操纵 Dom。这里的数据通过使用范围(或this在控制器内部使用)从视图(用户)到控制器,然后使用我们通过注入服务(模型)获得的函数来操作模型。很多时候我们让控制器充当中介,这打破了MVC的规则,通过查询模型并将结果传递给视图,这就是不同的模式名称MVP。规则是:您的控制器必须始终尽可能精简。(完整代码

\n\n
.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  [..]\n
Run Code Online (Sandbox Code Playgroud)\n\n

视图:如图所示,模型更新视图,而不是控制器。如何?带有指令和过滤器。请注意,视图仅具有数据的表示(数据绑定)。不要包含复杂的逻辑。我想明确的是,在 MVC 中视图应该直接访问模型。指令和过滤器提供此功能。如果你想进行 DOM 操作,你必须使用指令(而不是控制器)。注意:我们将 dom 操作放在指令的编译和链接函数中,而不是在控制器中。( FULL CODE1 FULL CODE2 )

\n\n
\n

我无法理解 $scope 和 model\n 对象之间的区别

\n
\n\n

范围只是指我们看到的模型,但不是模型!范围也用于用户交互,控制器取决于范围,控制器取决于模型。

\n\n
\n

所以我可以以缓存的方式操作这个列表(将其保留在本地并偶尔更新它)?

\n
\n\n

有很多方法可以解决这个问题。通常我们使用观察者模式,但在 Angular 中,有另一种方法可以做到这一点,在大多数情况下效果更好。这里有一个例子:

\n\n
angular\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  }]);\n
Run Code Online (Sandbox Code Playgroud)\n\n

欲了解更多信息,请检查,有一些令人惊奇的答案。

\n