搜尋

首頁  >  問答  >  主體

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_u15822744 天前741

全部回覆(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-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);
      });
      

    回覆
    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
  • 取消回覆