zoukankan      html  css  js  c++  java
  • angularJS自定义服务的几种方式

    在angularJS中定义服务共有四种常见的方式:factory,service,provider,constant,value

    使用形式的不同:

    1)factory以返回对象的形式定义服务:

      myapp.factory('factorySer',[function() {
        return {
          getName: function () {
            return 'your name is tomHason-factory';
          }
        }
      }])

    2)service是使用new关键字实例化,所以直接使用this定义

     myapp.service('serviceSer',[function() {
        this.getName = function () {
          return 'your name is tomHason-service';
        }
      }])
    

    3)provider比较特殊,在定义服务的时候必须使用$get函数返回一个对象

    能注入到config的service,这样定义的service在你开始注入之前就已经实例化,开发共享的模块的时候常常使用它,能够在使用之前进行配置,比如你可能需要配置你的服务端的url

      // 能注入到config的service,这样定义的service在你开始注入之前就已经实例化,开发共享的模块的时候常常使用它,能够在使用之前进行配置,比如你可能需要配置你的服务端的url
      myapp.provider('providerSer', [function () {
          this.$get = function() {  
            return {
              name: 'your name is tomHason-provider',
              getName: function () {
                return  this.name;
              },
              setName: function (name) {
                return this.name = name;
              }
            }
        }  
      }])
    

    4)constant一般用于常量定义

    能注入到config的服务

    myapp.constant('constantSer', {name: 'Greasy Giant', age: 32});
    

    5)value与constant一样是用于定义常量的

     myapp.value('valueSer', {name:'tomHsm-valuse'})
    

     

    关于provider,以及constant在angularModule.config函数中的使用方式简单例子

    AngularJS模块可以在被加载和执行之前对其自身进行配置。我们可以在应用的加载阶段应用不同的逻辑组对其修改,在模块加载阶段,AngularJS会在提供者(provide)注册和配置的过程中对模块进行配置。

    在整个AngularJS的工作流中,这个阶段是唯一能够在应用启动前对其进行修改的部分。

    关于angularJS的config函数使用较多的地方就是配置路由的ui-router

    下面是一个简单provider服务使用在congfig函数中的例子:

    app.js

    define(['angular'],function(angular) {
        var myapp = angular.module('myapp',['ui.router']);
        myapp.provider('MyProvider', function() {  
            var defaultName = 'anonymous';  
            var name = defaultName;  
            this.setName = function(newName) {  
                name = newName;  
            }
            this.getName = function () {
                return name;
            } 
            this.$get = function() {  
                var result = {}; 
                result.name = name;  
                result.defaultName = defaultName;  
                result.getName = function () {
                    return this.name;
                }
                result.setName = function (name) {
                    this.name = name
                }
                return result;  
            }  
        })  
        myapp.constant('apiKey', '123123123')
        myapp.config(['$translateProvider','apiKey','MyProviderProvider',function($translateProvider,apiKey,MyProviderProvider) {
            MyProviderProvider.setName('Angularjs');  
    

    可以看到的是我们在模块定义的时候定义了一个provider形式的服务MyProvider,在config函数中使用了其setName()方法进行name的初始化【在config使用的时候是`服务名+‘Provider’`的形式】

    在控制器中使用这个服务的时候和其他服务形式是一样的

    define(['app','service/service.methods'],function(myapp){
      myapp.controller("servicesMethodsCtrl",["$scope",'$state',"$timeout","factorySer", "serviceSer", "constantSer",'valueSer','providerSer','MyProvider',
        function($scope,$state,$timeout,factorySer, serviceSer, constantSer,valueSer,providerSer,MyProvider){
          console.log("this is servicesMethodsCtrl");
        $timeout(function () {
          MyProvider.setName("vueJS");
          $scope.MyProviderName = MyProvider.getName();
          $scope.$apply();
        },2000)

      

    借题发挥:

    现如今项目十分复杂,涉及状态难以管理,于是就有了vuex,redux等等比较优秀的状态管理工具,本质上是全局定义一个对象,给几个api进行对象的属性维护。

    那么在angularJS中的服务也有异曲同工之妙,在某种程度上可以使用服务进行状态管理。

  • 相关阅读:
    HDU5343:MZL's Circle Zhou(SAM,记忆化搜索DP)
    动归皆背包——那些做过的背包
    CODEVS 3943 数学奇才琪露诺
    codevs 1540 银河英雄传说
    CODEVS 1004四子连棋
    洛谷1082 同余方程
    洛谷1006 传纸条
    洛谷1508 Likecloud-吃、吃、吃
    洛谷1108 低价购买
    洛谷1156 垃圾陷阱
  • 原文地址:https://www.cnblogs.com/evaling/p/10332116.html
Copyright © 2011-2022 走看看