angular.js - 怎麼在angular初始化時$http為factory賦初值
phpcn_u1582
phpcn_u1582 2017-05-15 16:54:00
0
4
690

因為覺得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_u1582
phpcn_u1582

全部回覆(4)
習慣沉默

想必你也發現了,你這樣寫的問題在於資料取得是異步的。 some.data刚开始还是undefined。但你的直觉是对的:通用的数据应当放在factoryservice裡面。現在來解決非同步的問題,有三種方案:

  1. 轉化為同步。這是最直接的方案,把需要的資料在伺服器端直接渲染在模板裡,factory从HTML中取数据,一般用input標籤。沿著這個思路,更好的方法是在啟動Angular App前設定好資源。可以參考這篇文章: http://harttle.github.io/2015/05/31/angular-scope-in​​itialize.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);
    });
    
给我你的怀抱

角.run(fn)

某草草

angularjs $http不支援同步取得

想要初始化或是從後端response.write輸出到前端
要嘛用jquery的ajax阻塞取得data後再初始化angular
路由的話 可以用resolve注入controller

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

PHPzhong

初始化的方法千千萬,關鍵不在於你要的值是同步獲取還是異步獲取,而是你在哪裡用,何時用?目標導向決定你使用什麼方法初始化。當然在大多數情況下建議使用 promise。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!