首页 > 怎么在angular初始化时$http为factory赋初值

怎么在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初始化的时候把从服务器取一些值之后可以一直用


想必你也发现了,你这样写的问题在于数据获取是异步的。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);
    });
    

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


angularjs $http不支持同步获取

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

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


angular.run(fn)

【热门文章】
【热门文章】