问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

AngularJS开发中,何时应该使用Directive,Controller,Service

发布网友 发布时间:2022-04-27 10:23

我来回答

1个回答

热心网友 时间:2022-04-22 16:17

  AngularJS是一款非常强大的前端MVC框架。同时,它也引入了相当多的概念,这些概念我们可能不是太熟悉。这些概念有:
  Directive(指令)
  Controller(控制器)
  Service (服务)
  下面我们逐个来看这些概念,研究一下为什么它们会像当初设计的那样强大,同时研究一下为什么我们要以那样的方式去使用它们。我们从Service开始。
  SERVICES(服务)
  如果你已经使用过AngularJS,你可能已经遇到过Service这个概念了,简而言之,Service就是【单例对象】在AngluarJS 中的一个别名。这些小东西(指单例对象)会被经常传来传去,保证你每次访问到的都是同一个实例,这一点和工厂模式不同。基于这种思想,单例对象让我们可以 实现一些相当酷的功能,它可以让很多controller和directive访问内部的数值。在#angularjs 频道(译者注:指的是原作者自己的博客频道)里面这也是非常常见的问题之一,那就是在应用中的不同代码块之间如何共享数据?我们来看这个问题。
  
  我们首先来创建一个mole(模块),本文中的所有代码都会用到这个mole。
  var mole = angular.mole( "my.new.mole", [] );

  下一步,我们来创建一个新的service(服务)。假设我们上面的这个mole是用来管理图书的。所以,这里我们来创建一个Book service,然后把一个JSON对象数组添加到这个serice中,这些对象代表很多book数据。
  mole.service( 'Book', [ '$rootScope', function( $rootScope ) {
  var service = {
  books: [
  { title: "Magician", author: "Raymond E. Feist" },
  { title: "The Hobbit", author: "J.R.R Tolkien" }
  ],

  addBook: function ( book ) {
  service.books.push( book );
  $rootScope.$broadcast( 'books.update' );
  }
  }
  return service;
  }]);

  这是一个非常简单的service(有时候这样就够你用了)。我们这里正在做的事情就是在管理一个book 数组,同时还带有一个addBook方法,在有需要的时候可以添加更多书籍。addBook方法还会在application上广播一个事件,告诉所有正 在使用我们的service的人,数组已经被更新了,从而让它们自己也做一些刷新操作。现在,我们要做的就是把这个service传递给各种 controller、directive、filter,或者其它任何需要它的东西---然后它们就可以访问service中的这些方法和属性了。好, 我们来动手。
  var ctrl = [ '$scope', 'Book', function( scope, Book ) {
  scope.$on( 'books.update', function( event ) {
  scope.books = Book.books;
  scope.$apply();//注意,原文这里少了这一行
  });
  scope.books = Book.books;
  }];
  mole.controller( "books.list", ctrl );

  同样非常简单。我们上面所做的就是为我们的mole创建了一个新的controller。在创建的时候把$scope provdier和我们自己的Book service传递给了它。能明白我们在干嘛吗?我们把前面创建的Book service中的books数组赋给了controller内部的局部scope对象。很酷,对吧?
  好,这里的核心问题是什么呢?我们节省了一些时间,并且在controller上创建了一个数组。对---我们确实这样做了。这样做确实也为我们节 约了一点时间---但是如果我们要在其它地方处理这些书籍信息应该怎么办呢?通过scope来维护数据是非常粗暴的一种方式。由于其它 controller、directive、model的影响,scope很容易就会崩溃或者变脏。它很快就会变成一团乱麻。通过一种集中的途径(在这里 就是service)来管理所有书籍数据,然后通过某种方式来请求修改它,这样不仅仅会更加清晰---同时当应用的体积不断增大的时候也更加容易管理。最 后,它还可以让你的代码保持模块化(这也是Angular很擅长的一件事情)。一旦你在其它项目中需要用到这个service,你没有必要在scope、 controller、filter等等东西里面到处去查找相关的代码,因为所有东西都在service里面!
  好。那么我们什么时候应该使用service呢?答案是:无论何时,当我们需要在不同的域*享数据的时候。另外,多亏了Angular的依赖注入系统,实现这一点是很容易并且很清晰的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...是多少?如果在青海湖没有出现高原反应,那么在拉萨市一般也不会_百度... 2023长虫山开车最佳到山顶路线 蛋挞怎么做好吃 蛋挞的做法是什么 如图,斜三棱柱ABC-A1B1C1中,A1C1⊥BC1,AB⊥AC,AB=3,AC=2,侧棱与底面... 魅族20classic手机通病 为什么反映魅族手机质量、发热、续航、信号与系统bug的网友如此多... 快来人,急救,魅族mx出问题了 我的魅蓝note2(系统是Flyme5.1.6)在联系人里存到有备注的号码怎么在来... 有拿到魅族mx3的吗,我的到了问题好多啊。 揭秘!女友说“你不爱我了”的真正含义 angularjs中有多个过滤器使用方法 angularjs怎么使用js angularjs中使用redio时,使用ng-model怎么获取两个不同的值 如何在AngularJs中调用第三方插件库 为什么angularjs中使用wdatepciker控件却无法绑定时间 angularjs中使用路由,当跳转到某个view的时候我想执行在子页面中写... 如何在angularjs中config的使用 如何在angularjs中使用highcharts angularjs中使用ng-repeat渲染页面,点击元素,如何知道点击的哪个元素... 如何在angularjs中使用jquery的ztree插件 如何在AngularJS中使用插件 有人说有些北方人,尤其是中原地区的人很少吃鱼,这是怎么回事? 我很喜欢吃鱼,想问下老娘舅快餐的鱼做的怎么样? 老娘舅 红烧鱼 是什么鱼 说说鱼的几种做法?? 谁知道鱼有几种做法 红烧鱼怎么做皮不会破 请问红烧鱼该怎么做 家常红烧鱼怎么做好吃,家常红烧鱼的吃法 网络不可上网怎么回事如何解决问题? 怎样在angularjs中调用nodejs post服务 什么是 angularjs 中的作用域 百度贴吧怎么看自己的回复数 《老酒馆》是谁主演的?讲述了什么故事? 在百度贴吧怎么查询我回复过的贴子? 百度贴吧里面的回复删了,自己还是能看到,怎样能彻底删除了,求帮忙 《老酒馆》中的老警察还演过什么作品? 《老酒馆》最大的反派角色是谁?三大反派的结局分别是什么? 老二两是什么电视剧 程煜在《老酒馆》中演的什么角色?你喜欢吗? 《老酒馆》中有很多老戏骨出演,是什么吸引了他们? 《老酒馆》老警察的结局是什么? 《老酒馆》各个人物结局是什么? 《老酒馆》中张可盈的演技遭诟病,星二代的身份给她带来了些什么? 《老酒馆》最后每个人的结局分别是什么? 大家对最近热播的《老酒馆》有什么看法呢? 《老酒馆》中,小晴天缠着陈怀海的原因是什么? photoshop怎么画一条直线终点是圆点的,不是箭头的、 各位大神这个圆点的线在ps里是怎么做的呢 《老酒馆》里的张可盈在剧中灰头土脸,现实中的她又是什么样子?