码迷,mamicode.com
首页 > Web开发 > 详细

AngularJS(二)——使用AngularJS自定义service

时间:2015-06-08 15:11:30      阅读:491      评论:0      收藏:0      [点我收藏+]

标签:javascript   service   angularjs   

Java 相似, AngularJS 中的 controller 应该尽可能保持短小精悍,不提倡在 controller 中进行 DOM 操作和数据操作。先来看一个臃肿、难以维护的 controller

var app = angular.module(‘APPModule‘, []);
app.controller(‘MainController‘, function($scope) {
  $scope.shouldShowLogin = true;
  $scope.showLogin = function() {
    $scope.shouldShowLogin =!$scope.shouldShowLogin;
};
$scope.clickButton = function() {
  $(‘#btnspan‘).html(‘Clicked‘);
};
$scope.onLogin = function(user) {
  $http({
    method: ‘POST‘,
    url: ‘/login‘,
    data: {
      user: user
  }
  }).success(function(data) {
    //Some Actions
  });
};
});

coding 初学者总是倾向于写这种代码。更加优雅的方法是通过使用 service directive 使 controller 更轻量,更易于维护。下面来看看如何自定义并使用service

 

1.通过 factory() 创建自定义 service

var app =angular.module(‘APPModule‘, []);
app.factory(‘UserService‘, [
  ‘$http‘,
  function($http) {
    var runLogin = function(user) {
      $http({
        method: ‘POST‘,
     url: ‘/login‘,
     data: {
       user: user
     }
    }).success(function(data) {
      //Some Actions
    });
    };
   
    return {
      runLogin: runLogin
    };
  }
]);

不难发现,如此声明自定义的 service 后,我们将之前臃肿的 controller 中的登录逻辑放到了 UserService 中,代码马上变得逼格十足。

 

2.使用自定义 service

app.controller(‘MainController‘, [
 ‘$scope‘,
  ‘UserService‘,
  function($scope, UserService) {
    $scope.onLogin = function(user) {
      UserService.runLogin(user);
    };
  }
]);

这里的 UserService就是我们自定义的 service ,在 controller 初始化时注入,即可使用其中的值和方法了。注意一点,在自定义服务之前注入所有的 AngularJS 内置服务,是约定俗称的规则。

如果自定义的service 和使用它的 controller 不在一个 module中,需要在 controller 所在 module 初始化时注入 service 所在的 module

var serviceModule = angular.module(‘ServiceModule‘, []);
serviceModule.factory(‘UserService‘, [
  ‘$http‘,
  function($http) {
    … //与之前UserService相同
  }
]);
//在controller所在的module中注入service所在的module
var app =angular.module(‘APPModule‘, [‘ServiceModule‘]);
app.controller(‘MainController’, [
  ‘$scope‘,
  ‘UserService‘,
  function($scope, UserService) {
   … //与之前controller相同
  }
]);

 

3.创建自定义 service 的其他方式:

factory() 方法是用来创建服务的最常规方式,除此之外,还有其他方式可以创建服务。

3.1 provider()

app.provider(‘UserService‘, {
  self: this,
  setName:function(name) {
    self.name = name;
  },
  $get: function() {
    return {
      getName: function() {
        return self.name;
      }
    };
  }
});

使用provider() 创建时,返回的对象中必须有 $get() 函数对象,否则会创建失败。用 provider() 创建服务可以在多个应用使用同一个服务时获得更强的扩展性,通过如下方式进行扩展:

app.config(function(UserServiceProvider) {
  NameServiceProvider.setName(‘Lucy‘);
});

其中,UserServiceProvider为对应的服务名 + Provider组成,通过这一对象可以调用 UserService中的方法。

3.2 constant()

该方法可以将变量值注册为服务,可以使该变量被其他 module controller 共享:

app.constant(‘ASToken‘, ‘12345‘);
app.controller(‘MainController‘, [
  ‘$scope‘,
 ‘ASToken‘, //注入constant
 function($scope, ASToken) {
   //Some Actions
 }
]);

constant 注入后就可以直接使用了。

3.3 value()

constant()用法相同。与 constant() 的区别是,constant() 可以注入到 config 中,而 value() 不行:

app.constant(‘ASToken‘, ‘12345‘).config(function(ASToken) {
  //正常使用
});
app.constant(‘ASValue’, ‘12345‘).config(function(ASValue) {
  //ASValue在config中无法访问
});

 

4.AngularJS中的拦截器$provide.decorator()

AngularJS 中的 $provide 服务提供了在服务实例创建时对其进行拦截的功能,可以对服务进行扩展和修改。不仅可以使用在自定义服务上,也可以对AngularJS 的内置服务进行拦截。以拦截 3.1 provider() 创建的 UserService 为例:

app.config([
  ‘$provide’,
  function($provide) {
    $provide.decorator(‘UserService‘, [
      ‘$delegate‘,
      function($delegate) {
        return{
          getName: function() {
            return $delegate.getName() + ‘ <-- TheFunction Has Been Decorated.‘
          },
          getAge: function() {
            return 18;
          }
        };
      }
    ]);
  }
]);

如上所示,在 config 中,通过 $provide.decorate() 方法拦截 UserService ,注入的 $delegate 可以调用要拦截的 service 中原本的方法。这里我们通过对UserService 进行拦截,修改了 UserService 中的 getName() 方法,并为 UserService 添加了 getAge() 方法。

完。

 

参考资料:

AngularJS 权威教程》作者:Ari Lerner  译者:赵望野 徐飞 何鹏飞


本文出自 “细桶假狗屎” 博客,请务必保留此出处http://xitongjiagoushi.blog.51cto.com/9975742/1659620

AngularJS(二)——使用AngularJS自定义service

标签:javascript   service   angularjs   

原文地址:http://xitongjiagoushi.blog.51cto.com/9975742/1659620

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!