当前位置: 首页 > 面试题库 >

为什么要在Angular中使用服务?

孟文栋
2023-03-14
问题内容

我只是从Angular开始。阅读Google文档中的服务示例,我只是想知道为什么您会选择使用服务而不是将变量和函数正确地保留在控制器中?

angular.
 module('MyServiceModuleDI', []).
 factory('notify', function($window) {
    var msgs = [];
    return function(msg) {
      msgs.push(msg);
      if (msgs.length == 3) {
        $window.alert(msgs.join("\n"));
        msgs = [];
      }
    };
  });

function myController($scope, notify) {
  $scope.callNotify = function(msg) {
    notify(msg);
  };
}

在这种情况下,您何时选择使用服务?


问题答案:

我认为主要原因是:

  • 在控制器之间持久并共享数据。
    IE:您创建了一个从数据库中获取数据的服务,如果将其存储在控制器中,一旦更改为另一个控制器,数据将被丢弃(除非您将其存储在$
    rootScope中,但这不是最好的方法),但如果将其保留在服务中(服务是单例),则在更改控制器时数据将保留。

  • 通过创建将由您的控制器/指令/服务使用的API来抽象数据访问逻辑。
    将业务逻辑保留在控制器内部,将数据逻辑保留在服务内部。

  • 干(不要重复自己)。
    IE:您需要在不同的控制器中拥有一系列功能,而无需提供服务,您将不必在每个控制器中重复执行代码;通过一项服务,您可以为此功能创建一个API并将其注入每个Controller
    / Directive /您需要的服务。

这是一个例子:

var myApp = angular.module('myApp',[]);


//Here is the service Users with its functions and attributes
//You can inject it in any controller, service is a singleton and its data persist between controllers
myApp.factory('Users', function () {

    //data logic
    //fetch data from db and populate...
    var name = "John";
    var surname = "Doe"

    function getName() { return name; }
    function getFullName() { return name + ' ' + surname; }
    function setName(newName) { name = newName; }

    //API
    return {
        getName: getName,
        getFullName: getFullName,
        setName: setName
    }
});

//An Util service with methods I will use in different controllers   
myApp.factory('Util', function () {

    //a bunch of useful functions I will need everywhere
    function daysInMonth (month,year) {
        return new Date(year, month+1,0).getDate();
    }

    return {
        daysInMonth: daysInMonth    
    };
});

//Here I am injecting the User and Util services in the controllers   
myApp.controller('MyCtrl1', ['$scope', 'Users', 'Util', function ($scope, Users, Util) {

    $scope.user = Users.getFullName(); //"John Doe";
    Users.setName('Bittle');

    //Using Util service
    $scope.days = Util.daysInMonth(05,2013);
}]);

myApp.controller('MyCtrl2', ['$scope', 'Users', 'Util', function ($scope, Users, Util) {

    $scope.user = Users.getFullName(); //"Bittle Doe"; //The change that took place in MyCtrl1 hhas persisted.

}]);


 类似资料:
  • 问题内容: 我试图弄清楚为什么在他提供的示例中首先需要服务层。如果你将其取出,则可以在客户中执行以下操作: 似乎服务层只是DAO的包装。有人可以给我一个情况,如果服务层被删除,情况可能会变得一团糟?我只是看不到拥有服务层的意义。 问题答案: 让服务层成为DAO的包装是一种常见的反模式。在你提供的示例中,它肯定不是很有用。使用服务层意味着你将获得以下好处: 你需要在控制器中最好完成的Web类型活动和

  • 本文向大家介绍为什么要使用微服务?相关面试题,主要包含被问及为什么要使用微服务?时的应答技巧和注意事项,需要的朋友参考一下 随着互联网的快速发展,各行各业都在用互联网。互联网已经离不开人们的形形色色。随着越来越多的用户,业务场景也愈来愈复杂。 传统的单体架构已经很难满足互联网技术发展的要求,代码可维护性扩展性和可读性降低,维护成本的提高都是驱动微服务的发展趋势。

  • 问题内容: 我的应用程序中有一个弹出模式服务,名为。它只是在上翻转了一些布尔值,从而导致2条指令正确显示/隐藏。这是显示新模态时调用的函数 如您所见,我显示不透明的背景,然后设置了一个名为的变量,该变量随后通过DI传递到我的指令中。但是后来我注意到我的模态没有出现在适当的时候,而是在变量设置为true 之后出现在NEXT摘要循环中。然后,我必须添加作业周围的内容才能使其正常工作。但是,我认为仅当我

  • 问题内容: Angular对于构建单页应用程序非常有用。它基本上建立在当前范例上,在该范例中我们向不同的端点发出请求,以帮助我们创建更好的单页应用程序。 另一方面,我们拥有的Meteor似乎更加强大,特别是因为它们具有称为DDP的功能,该功能基本上允许双向数据流。看来Meteor是Angular的超集,并且显然是更好的选择。 尽管Angular确实提供了一些诸如测试和本地化之类的功能,但我只是不明

  • 本文向大家介绍为什么要在R中使用set.seed?,包括了为什么要在R中使用set.seed?的使用技巧和注意事项,需要的朋友参考一下 set.seed的使用是为了确保我们获得相同的随机结果。如果我们为R或任何统计软件中的任何任务随机选择一些观测值,则它始终会产生不同的值,这是由于随机化而发生的。如果我们想保留在第一次随机选择时产生的值,则可以通过在随机化之后将它们存储在一个对象中来实现,或者可以

  • 问题内容: 在下面的代码中,我展示了我认为在golang中嵌入(提升方法的地方)和组合(提升方法的地方)之间的区别。 为什么要在golang中使用组合? 问题答案: 值得阅读有关“嵌入到有效Go中”的部分。 一个常见的示例是具有Mutex的结构/映射。 打字容易得多 而不是必须编写适当的包装器函数(重复的)或遇到困难 当你将永远做互斥领域的唯一事情就是访问方法(和在这种情况下) 当您尝试在嵌入式字