`
hudeyong926
  • 浏览: 2035178 次
  • 来自: 武汉
社区版块
存档分类
最新评论

AngularJS 服务 demo

 
阅读更多

我们知道Angular提供的标准服务组件有以下:

  • $http:用于处理 XMLHttpRequest
  • $location:提供当前URL的信息
  • $q: 异步请求使用,promise/deferred模块
  • $routeProvider:配置路由
  • $log:日志服务

$http有下面短方法:$http.get() $http.head() $http.post() $http.put() $http.delete() $http.jsonp()

 

$的命名约定

前缀$是表示 Angular自己提供的服务名称,如$scope或$provide等,为了防止冲突,最好避免命名自己开发的服务以为$开头

如果你检查一个scope内部,你也可能会发现一些属性开头也是以 $开头。这些特性被认为是私有的,并且不应该访问或修改。

下面这个代码是将$window注入到自己的服务中:

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

这是一个通知服务,将消息发送到所有Angular提供的window窗口中显示。

要注意的是所有AngularJS服务都是单例的。这意味着在每一个注入器中都只有一个需要的服务的实例。因为AngularJS极度讨厌全局的东西,这是符合面向对象OO。

 

$resource服务与REST

在我们看怎样用 ngResource 方法创建一个 resource 资源之前,我们先看一下怎样用基本的$http 服务做类似的事情.比如我们的信用卡 resource,我们想能够读取、查询、保存信用卡信息,另外还要能为信用卡还款.这儿是上述需求一个可能的实现:
myAppModule.factory('CreditCard', ['$http', function($http) {
    var baseUrl = '/user/123/card';
    return {
       get: function(cardId) {
           return $http.get(baseUrl + '/' + cardId);
       },
       save: function(card) {
           var url = card.id ? baseUrl + '/' + card.id : baseUrl;
           return $http.post(url, card);
       },
       query: function() {
           return $http.get(baseUrl);
       },
       charge: function(card) {
           return $http.post(baseUrl + '/' + card.id, card, {params: {charge:true}}); 
       }
    }; 
}]);

$resource是一个依赖$Http的服务组件,它创建了一个资源对象,让你与RESTful服务器端数据源实现交互的工厂。返回的是资源对象,提供了高层次的行为,而不需要与低级别$ HTTP服务交互操作方法。需要ngResource 安装(<script src="lib/angular/angular-resource.js"></script>)。

对返回的数据进行默认的如下操作:

{ 
'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'} 
};

例如:

var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
user.abc = true;
user.$save(); 
});

User定义为资源$resource类型,小写的user是其一个实例,实际是从服务器抓取的根据id为123的一个User Json数组,那么我们下面可以对user这个实例使用上面几个默认操作,比如user.$save();。可以轻松地执行CRUD操作(创建,读取,更 新,删除)。

总结为:

 修改

app.factory('itemCategoryService', ['$resource', function($resource) {
  return $resource(
    '../systemConfig/updateCategory/:id', {}, {edit: {method: 'put'}}
  );
}]);
var item = new itemCategoryService;
item.name = $scope.typeData.name;
item.code = $scope.typeData.code;
item.$edit({'id': $scope.typeData.id}, function(data) {
  $location.url('/typeList');
}, function(error) {
});

删除

$resource('../systemConfig/delCategory/:id').remove({'id' : id});

 

下面以phone举例返回列表:

var phonecatServices = angular.module('phonecatServices', ['ngResource']);
 
phonecatServices.factory('Phone', ['$resource',
  function($resource){
    return $resource('phones/:phoneId.json', {}, {
      query: {method:'GET', params:{phoneId:'phones'}, isArray:true}
    });
  }]);

这是从后台返回phone列表的$resource用法。节省了$http之类转换。

 

AngularJS提供了一个内置Service $q,它提供了一种承诺/延后(promise/deferred),可以保证我们的调用代码一定能够拿到数据。当然,我们可以猜到,最后去服务器取数据 的方式肯定是异步的。只不过这个服务提供了表面上是同步访问的API,当数据获取成功之后,自动将数据提供给调用的代码。

1. 创建一个Service,去服务器读取数据:

// $q 是内置服务,所以可以直接使用
ngApp.factory('UserInfo', ['$http', '$q', function ($http, $q) {
  return {
    query : function() {
      var deferred = $q.defer(); // 声明延后执行,表示要去监控后面的执行
      $http({method: 'GET', url: 'scripts/mine.json'}).
      success(function(data, status, headers, config) {
        deferred.resolve(data);  // 声明执行成功,即http请求数据成功,可以返回数据了
      }).
      error(function(data, status, headers, config) {
        deferred.reject(data);   // 声明执行失败,即服务器返回错误
      });
      return deferred.promise;   // 返回承诺,这里并不是最终数据,而是访问最终数据的API
    } // end query
  };
}]);

 2. 在Controller上(以同步方式)使用这个Service:赋值

angular.module('ngApp')
  .controller('MainCtrl', ['$scope', 'UserInfo', function ($scope, UserInfo) { // 引用我们定义的UserInfo服务
    var promise = UserInfo.query(); // 同步调用,获得承诺接口
    promise.then(function(data) {  // 调用承诺API获取数据 .resolve
        $scope.user = data;
    }, function(data) {  // 处理错误 .reject
        $scope.user = {error: '用户不存在!'};
    });
  }]);

 欢迎讨论和交流AngularJS及前端开发

 
 
分享到:
评论

相关推荐

    angularJs demo 各种基本用法

    在"angularJs demo 各种基本用法"中,我们可以深入探讨以下几个关键概念:路由(router)、过滤器(filter)、服务(service)以及指令(diractive)。 **路由(Router)**: AngularJS的路由功能允许我们根据URL来...

    angularjs的demo

    angularjs的demo

    AngularJS入门小Demo

    **AngularJS 入门小 Demo** AngularJS 是一个强大的前端 JavaScript 框架,由 Google 维护,用于构建单页应用(Single-Page Applications, SPA)。它通过数据绑定和依赖注入等特性,极大地简化了网页开发过程。在这...

    angularjs_requirejs demo

    这个"angularjs_requirejs demo"是将AngularJS与RequireJS结合使用的一个示例项目,旨在帮助开发者更好地理解和实践这两种技术的集成。 **AngularJS** 是一个强大的前端MVC(Model-View-Controller)框架,由Google...

    angularjs demo

    这个"angularjs demo"压缩包很可能是包含了一些示例项目,帮助开发者理解和学习AngularJS的核心概念和功能。 首先,AngularJS的核心特性包括数据绑定、依赖注入、指令系统、过滤器和表单处理等。数据绑定是...

    angularjsdemo

    【描述】"angularjsdemo" 可能是一个包含多个子项目的集合,这些子项目展示了AngularJS的核心特性和最佳实践。通过这个项目,开发者可以学习到如何组织AngularJS项目结构,以及如何利用其数据绑定、依赖注入、指令、...

    SpringMVC整合AngularJS简单Demo.zip

    这个简单的Demo展示了如何将后端的强类型、服务驱动的SpringMVC与前端的动态、数据驱动的AngularJS结合,构建出一个功能完整、交互丰富的Web应用。通过学习这个Demo,开发者可以深入理解前后端分离的开发模式,以及...

    AngularJs2 官网demo

    angularJs2官网demo,使用方法:需要在本地安装npm,(https://nodejs.org/en/下载最新版本的nodeJs,保证node的版本高于等于v5.x.x,npm版本高于等于3.x.x),使用node -V或者npm -V检查版本。 下载文档之解压到某个目录...

    angularjs-demo-theme, 在http上,为post构建的演示主题.zip

    angularjs-demo-theme, 在http上,为post构建的演示主题 使用AngularJS和 WP REST API v2测试版 9在你的WordPress主题中这是我的教程文章中最后的项目文件: 使用AngularJS和 REST API 在你的WordPress主题中。...

    AngularJS_1..5.0_Demo

    AngularJS + Bootstrap Demo项目,获取豆瓣电影数据

    AngularJS+springmvc的demo

    在这个入门Demo中,AngularJS 负责前端展示和用户交互,通过`$http`服务向SpringMVC发送HTTP请求。SpringMVC接收到请求后,处理业务逻辑,然后返回JSON数据,AngularJS接收到数据后更新视图。虽然没有数据库交互,但...

    angularjs ui.router嵌套路由demo

    这个"angularjs ui.router嵌套路由demo"是展示如何在AngularJS项目中使用UI.Router进行多级路由配置和页面嵌套的一个实例。通过这个demo,我们可以深入理解UI.Router的工作原理和实际应用。 首先,UI.Router不同于...

    angularjs_demoapp1

    《AngularJS实战应用详解——基于angularjs_demoapp1的探索》 AngularJS,作为Google推出的一款前端MVC框架,以其强大的数据绑定和依赖注入特性在Web开发领域占据了一席之地。本文将通过分析名为"angularjs_demoapp...

    AngularJs demo 例子(表单验证) form

    本示例以"AngularJs demo 例子(表单验证)form"为主题,结合bootstrap美化,展示了如何在AngularJS中实现表单验证。 **1. AngularJS 表单基础** 在AngularJS中,表单是由`&lt;form&gt;`标签定义的,可以通过`ngForm`或`...

    AngularJSDemo:这是 angularJS 的演示

    入门要开始使用,您可以简单地克隆 AngularJSDemo 存储库并安装依赖项:先决条件我们还使用了一些 node.js 工具进行初始化。 您必须安装 node.js 及其包管理器 (npm)。 您可以从获取它们。克隆 AngularJSDemo 使用...

    springmvc+angularjs springmvc 整合angularjs demo

    在AngularJS中,我们可以创建控制器(Controller)、服务(Service)和工厂(Factory)来处理数据和业务逻辑,以及指令(Directives)来扩展HTML的功能。 整合SpringMVC与AngularJS的关键在于JSON数据交换。JSON是...

    AngularJS-Demo

    **AngularJS-Demo** AngularJS 是一款由Google维护的开源JavaScript框架,用于构建单页应用程序(SPA)。这个项目“AngularJS-Demo”很可能是为了演示AngularJS的核心特性和最佳实践,帮助开发者理解如何有效地利用...

    angularjsDEMO

    本篇文章将通过分析“angularjsDEMO”中的示例代码,深入探讨AngularJS的核心概念和实践应用。 1. **数据绑定**:AngularJS的一大亮点是双向数据绑定,它使得视图和模型之间的数据同步变得极其简单。在“demo”中,...

Global site tag (gtag.js) - Google Analytics