因為覺得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初始化的時候把從伺服器拿一些值之後可以一直用
習慣沉默2017-05-15 16:56:00
想必你也發現了,你這樣寫的問題在於資料取得是異步的。 some.data
刚开始还是undefined
。但你的直觉是对的:通用的数据应当放在factory
或service
裡面。現在來解決非同步的問題,有三種方案:
轉化為同步。這是最直接的方案,把需要的資料在伺服器端直接渲染在模板裡,factory
从HTML中取数据,一般用input
標籤。沿著這個思路,更好的方法是在啟動Angular App前設定好資源。可以參考這篇文章: http://harttle.github.io/2015/05/31/angular-scope-initialize.html#1
異步回調。用factory
回傳一個回呼函數,這樣寫:
javascript
xxx.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); });
使用Promise/Deffered模式來進行非同步。隨著專案越來越複雜,Promise是最終解決方案。 Angular提供了該模式的實作$q
,它是一个Service,$http.get
便會傳回一個Promise的實例。這樣用的:
javascript
xxx.factory('some', function($q, $http){ return $http.get(''); }); ... some.success(function(data){ console.log(data); });
某草草2017-05-15 16:56:00
angularjs $http不支援同步取得
想要初始化或是從後端response.write輸出到前端
要嘛用jquery的ajax阻塞取得data後再初始化angular
路由的話 可以用resolve注入controller
http://stackoverflow.com/questions/16286605/initialize-angularjs-servi...
PHPz2017-05-15 16:56:00
初始化的方法千千萬,關鍵不在於你要的值是同步獲取還是異步獲取,而是你在哪裡用,何時用?目標導向決定你使用什麼方法初始化。當然在大多數情況下建議使用 promise。