検索

ホームページ  >  に質問  >  本文

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日前740

全員に返信(4)返信します

  • 習慣沉默

    習慣沉默2017-05-15 16:56:00

    あなたの執筆の問題は、データ取得が非同期であることであることに気づいたはずです。 some.data は最初はまだ unknown でした。しかし、あなたの直感は正しいです。共通データは factory または service に配置する必要があります。非同期の問題を解決するには、3 つの解決策があります: 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 <オル>

    4. 同期に変換します。これは最も直接的な解決策であり、通常は input タグを使用して、factory が HTML からデータを取得します。この考え方に沿ったより良い方法は、Angular アプリを開始する前にリソースをセットアップすることです。この記事を参照してください: http://harttle.github.io/2015/05/31/angular-scope-in​​itialize.html#1
    <リ> 🎜非同期コールバック。 factory を使用してコールバック関数を返し、次のように記述します: 🎜 リーリー 🎜 <リ> 🎜非同期操作には Promise/Defered モードを使用します。プロジェクトが複雑になるにつれてPromise が究極のソリューションとなります。 Angular は、このパターン $q の実装を提供します。これは、 $http.get が Promise インスタンスを返すサービスです。このように使用されます: 🎜 リーリー 🎜 🎜

    返事
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-15 16:56:00

    angular.run(fn)

    返事
    0
  • 某草草

    某草草2017-05-15 16:56:00

    angularjs $http は同期取得をサポートしていません

    バックエンドからフロントエンドにresponse.writeを初期化または出力したい
    または、jquery の ajax ブロッキングを使用してデータを取得し、angular を初期化します
    ルーティングの場合、resolve を使用してコントローラーを挿入できます

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

    返事
    0
  • PHPz

    PHPz2017-05-15 16:56:00

    初期化メソッドは何千もあります。重要なのは、必要な値を同期的に取得するか非同期的に取得するかではなく、それをいつどこで使用するかです。目標の方向性によって、初期化に使用する方法が決まります。もちろん、ほとんどの場合、Promise を使用することをお勧めします。

    返事
    0
  • キャンセル返事