搜索

首页  >  问答  >  正文

angular.js - 怎么在angular初始化时$http为factory赋初值

因为觉得factory是单例的所以把http结果作为factory的返回值,怎么做到在angular初始化时$http为factory赋初值?
angular.module('some',[]) .factory('factory',function($http){ var some = {}; $http.get('url') .success(function(resp){ some.data = resp; }) return some.data; })
现在类似是这样写的,我就希望angular初始化的时候把从服务器取一些值之后可以一直用

phpcn_u1582phpcn_u15822793 天前770

全部回复(4)我来回复

  • 習慣沉默

    習慣沉默2017-05-15 16:56:00

    想必你也发现了,你这样写的问题在于数据获取是异步的。some.data刚开始还是undefined。但你的直觉是对的:通用的数据应当放在factoryservice里面。现在来解决异步的问题,有三种方案:

    1. 转化为同步。这是最直接的方案,把需要的数据在服务器端直接渲染在模板里,factory从HTML中取数据,一般用input标签。沿着这个思路,更好的办法是在启动Angular App前设置好资源。可以参考这篇文章: http://harttle.github.io/2015/05/31/angular-scope-initialize.html#1

    2. 异步回调。用factory返回一个回调函数,这样写:

      javascriptxxx.factory('some', function($http){
          var some = {}
          function get(cb){       
              if(some.data) return cb(some.data);     
              $http.get('').success(function(d){
                  cb(some.data = d);
              });
          }
          return get;
      });
      ...
      some.get(function(data){
          console.log(data);
      });
      
    3. 使用Promise/Deffered模式来进行异步。随着项目越来越复杂,Promise是最终解决方案。Angular提供了该模式的实现$q,它是一个Service,$http.get便会返回一个Promise的实例。这样用的:

      javascriptxxx.factory('some', function($q, $http){
          return $http.get('');
      });    
      ...
      some.success(function(data){
          console.log(data);
      });
      

    回复
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-15 16:56:00

    角.run(fn)

    回复
    0
  • 某草草

    某草草2017-05-15 16:56:00

    angularjs $http不支持同步获取

    想要初始化要么从后端response.write输出到前端
    要么用jquery的ajax阻塞获取到data后再初始化angular
    路由的话 可以用resolve注入controller

    http://stackoverflow.com/questions/16286605/initialize-angularjs-servi...

    回复
    0
  • PHPz

    PHPz2017-05-15 16:56:00

    初始化的方法千千万,关键不在于你要的值是同步获取还是异步获取,而是你在哪里用,何时用?目标导向决定你使用什么方法初始化。当然在大多数情况下推荐使用 promise。

    回复
    0
  • 取消回复