因为觉得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
。但你的直觉是对的:通用的数据应当放在factory
或service
里面。现在来解决异步的问题,有三种方案:转化为同步。这是最直接的方案,把需要的数据在服务器端直接渲染在模板里,
factory
从HTML中取数据,一般用input
标签。沿着这个思路,更好的办法是在启动Angular App前设置好资源。可以参考这篇文章: http://harttle.github.io/2015/05/31/angular-scope-initialize.html#1异步回调。用
factory
返回一个回调函数,这样写:使用Promise/Deffered模式来进行异步。随着项目越来越复杂,Promise是最终解决方案。Angular提供了该模式的实现
$q
,它是一个Service,$http.get
便会返回一个Promise的实例。这样用的:angular.run(fn)
angularjs $http不支持同步获取
想要初始化要么从后端response.write输出到前端
要么用jquery的ajax阻塞获取到data后再初始化angular
路由的话 可以用resolve注入controller
http://stackoverflow.com/questions/16286605/initialize-angularjs-servi...
初始化的方法千千万,关键不在于你要的值是同步获取还是异步获取,而是你在哪里用,何时用?目标导向决定你使用什么方法初始化。当然在大多数情况下推荐使用 promise。