首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Angular JS服务中返回数据的目的是什么

在Angular JS服务中返回数据的目的是什么
EN

Stack Overflow用户
提问于 2016-03-19 18:59:47
回答 2查看 73关注 0票数 0

我刚开始使用angular JS,在我使用的服务中有一些我不太理解的东西:

代码语言:javascript
复制
(function () {

  angular
    .module('meanApp') // service qui dépend de ce module ?
    .factory('authentication', authentication);

  // $inject : To allow the minifiers to rename the function parameters and still be able to inject the right services, the function needs to be annotated with the $inject property. The $inject property is an array of service names to inject.
  // https://docs.angularjs.org/guide/di

  authentication.$inject = ['$http', '$window'];

  function authentication ($http, $window) {

    console.log("enters authentication service");
    var saveToken = function (token) {
      $window.localStorage['mean-token'] = token;
    };

    var getToken = function () {
      return $window.localStorage['mean-token'];
    };

    var isLoggedIn = function() {
      var token = getToken();
      var payload;

      if(token){
        payload = token.split('.')[1];
        payload = $window.atob(payload); //will decode a Base64 string
        payload = JSON.parse(payload);

        return payload.exp > Date.now() / 1000;
      } else {
        return false;
      }
    };

    var currentUser = function() {
      if(isLoggedIn()){
        var token = getToken();
        var payload = token.split('.')[1];
        payload = $window.atob(payload);
        payload = JSON.parse(payload);
        return {
          email : payload.email,
          name : payload.name
        };
      }
    };

    //An interface between the Angular app and the API, to call the login and register end-points and save the returned token. This will use the Angular $http service


    var register = function(user) {
      console.log("ARNAUD: Arriving in register promise");
      return $http.post('/api/register', user).success(function(data){
        saveToken(data.token);
      });
    };

    var login = function(user) {
      return $http.post('/api/login', user).success(function(data) {
        saveToken(data.token);
      });
    };

    var logout = function() {
      $window.localStorage.removeItem('mean-token');
    };


   // must return an object or function or at least a value from the factory
    return {
      currentUser : currentUser,
      saveToken : saveToken,
      getToken : getToken,
      isLoggedIn : isLoggedIn,
      register : register,
      login : login,
      logout : logout
    };

  }


})();

上面声明的函数已经返回了我需要的内容,我只需要在我的控制器中调用它们:

代码语言:javascript
复制
authentication.register(vm.credentials)

的确切目的是什么?

代码语言:javascript
复制
return {
  currentUser : currentUser,
  saveToken : saveToken,
  getToken : getToken,
  isLoggedIn : isLoggedIn,
  register : register,
  login : login,
  logout : logout
};

对于angular JS高级开发人员来说,这可能是一个愚蠢的问题,但我并不清楚这一点

谢谢你帮我解释这个问题

EN

回答 2

Stack Overflow用户

发布于 2016-03-19 19:03:24

工厂是一个由angular调用的函数,它应该返回您想要使应用程序可用的服务实例。

如果您没有从工厂返回任何内容,那么它实际上会返回未定义的内容,并且每次您在控制器、指令等中注入authentication服务时,您都会得到未定义的内容,而不是获得一个带有方法的对象。

票数 0
EN

Stack Overflow用户

发布于 2016-03-19 19:07:01

module.factory()将返回一个对象->,以便您能够在该对象上调用任何必须返回它的对象。

另一种方法是使用module.service -这将返回一个实例。

代码语言:javascript
复制
module.service('test', function() {
  this.nice = function () {};
});

module.factory('test', function() {
  function something() {}
  return {
    nice: something
  };
});

工厂比服务强大得多--想象一下:

代码语言:javascript
复制
module.fatory('prefix', function() {
  return function (prefix) {
    return {
      log: function (message) {
        console.log(prefix+': '+message;
      }
    };
  };
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36100836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档