草庐IT

javascript - 在 angularJS 应用程序中将模型保存在哪里?

coder 2024-07-30 原文

我仍在学习 angularjs,我无法理解 $scopemodel 对象之间的差异,这目前阻止我组织(使用一些最佳实践)我的应用程序.
据我了解,$scope 应该是只读的(看了一些我听到这个的教程)。

因此,当我加载应用程序时,我应该使用 service 从数据库中获取一些数据并将其存储在 model 中。

更新

现在,我从服务器获得的所有数据都存储在 Controller $scope 中,我正在尝试将其移动到服务中并使 Controller 变笨。
我也检查这个 article我正在尝试使用第二个或第三个选项,但仍然找不到实现它的最佳方法。
这是我的服务和 Controller :

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;
                });
        }
    }

但在这个实现中,待办事项列表又在 Controller 中。

从服务器和应该设置的位置(从 Controller 或服务)获取此列表后,我应该将其存储在哪里,以便我可以以缓存的方式操作此列表(将其保存在本地并偶尔更新)?

我来自 C# 世界,在那里我总是使用实体对象(例如用户、产品、项目等)在循环中填充这些对象并将其存储在列表中。我找不到一种方法,我应该如何在 Angular 上使用这种方法,如果是的话,应该只使用属性服务吗?

我使用一项服务来保存列表,并使用一项服务来包含 CRUD 功能。 如果我从模型中将数据加载到 $scope 中,如果代码的其他部分更改了模型中的数据,如何稍后更新该范围?

例如,更改可以来自另一个 Controller 或通过 SignalR 更新。 另外,当我更新数据时,我听说 $scope 应该是只读的,我需要更新服务,然后如何以及何时更新 $scope

如果我的问题太菜鸟了,我很抱歉,但如果有人可以帮助我了解在哪里保持 Angular ,我将不胜感激?

最佳答案

该模型更常用于名为模型- View - Controller (MVC) 的软件架构模式中。如果不了解完整模式,就无法理解模型的工作原理。在这种模式中,Web 应用程序被分解成组件,目的是分离职责。我将通过一个完整的 TODO 代码示例来指导您了解 MVC 的实际用途。

模型:获取/操作所有域数据(更多时候是从服务器获取)。在这里,您创建了一个清晰的 API,可以访问服务中发生的数据。在服务中,您从服务器获取数据,将它们保存在内部,然后提供一些提供访问权限的功能,当有人需要这些数据时,他只需使用注入(inject)来访问服务。将这种服务视为具有数据、get/set 和其他方法的单例类。一条规则是:如果您不知道某物的去向,则更有可能是去服务处。 (FULL CODE)

.factory('api', function ($resource) {
    'use strict';

    var store = {
        //HERE IS THE API
        todos: [],

        api: $resource('/api/todos/:id', null,
            {
                update: { method:'PUT' }
            }
        ),
        clearCompleted: function ()[..]
        delete: function (todo)[..]
        get: function () [..]
        insert: function (todo)[..] 
        put: function (todo)[..]
    };
    return store;
})

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

.controller('TodoCtrl', function TodoCtrl($scope, $routeParams, $filter, store) {
  //store is the model, we make this in app.js
  //is the result of a factory we make up,and we named "api"
  var todos = $scope.todos = store.todos;
  [..]
  //in html we call removeTODO
  //<button class="destroy" ng-click="removeTodo(todo)"></button>
  //We use user interaction to manipulate the model!
  $scope.removeTodo = function (todo) {
    store.delete(todo);//we use the api we make
  };
  [..]

View :正如您在图像中看到的,模型更新 View ,而不是 Controller 。如何?带有指令和过滤器。小心, View 只有数据的呈现(数据绑定(bind))。不要包含复杂的逻辑。我想明确一点,在 MVC 中, View 应该直接访问模型。指令和过滤器提供此功能。如果你想进行 DOM 操作,你必须使用指令(而不是 Controller )。注意:我们将dom操作放在指令的编译和链接函数中,而不是在 Controller 中。( FULL CODE1 FULL CODE2 )

I have problem with understanding the difference between $scope and model object

Scope只是我们看到的模型,而不是模型!范围也用于用户交互, Controller 取决于范围, Controller 取决于模型。

so I can manipulate this list in a cached way (keep it local and update it occasionally)?

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

angular
  .module("testApp", [])
  .service("myDataService", function(){
    this.dataContainer = {
      valA : "car",
      valB : "bike"
    }
  })
  .controller("testCtrl", [
    "$scope",
    "myDataService",
    function($scope, myDataService){
      $scope.data = function(){
        //you get always the update data and never store tha data
        //to the controller
        return myDataService.dataContainer;
      };
  }]);

更多信息请查看this ,有一些惊人的答案。

关于javascript - 在 angularJS 应用程序中将模型保存在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36955841/

有关javascript - 在 angularJS 应用程序中将模型保存在哪里?的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  4. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  5. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  6. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  7. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  8. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  9. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  10. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

随机推荐