因为觉得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
は最初はまだ unknown
でした。しかし、あなたの直感は正しいです。共通データは factory
または service
に配置する必要があります。非同期の問題を解決するには、3 つの解決策があります: 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
<オル>
input
タグを使用して、factory
が HTML からデータを取得します。この考え方に沿ったより良い方法は、Angular アプリを開始する前にリソースをセットアップすることです。この記事を参照してください: http://harttle.github.io/2015/05/31/angular-scope-initialize.html#1factory
を使用してコールバック関数を返し、次のように記述します: 🎜
リーリー
🎜
<リ>
🎜非同期操作には Promise/Defered モードを使用します。プロジェクトが複雑になるにつれてPromise が究極のソリューションとなります。 Angular は、このパターン $q
の実装を提供します。これは、 $http.get
が Promise インスタンスを返すサービスです。このように使用されます: 🎜
リーリー
🎜
🎜某草草2017-05-15 16:56:00
angularjs $http は同期取得をサポートしていません
バックエンドからフロントエンドにresponse.writeを初期化または出力したい
または、jquery の ajax ブロッキングを使用してデータを取得し、angular を初期化します
ルーティングの場合、resolve を使用してコントローラーを挿入できます
http://stackoverflow.com/questions/16286605/initialize-angularjs-servi...
PHPz2017-05-15 16:56:00
初期化メソッドは何千もあります。重要なのは、必要な値を同期的に取得するか非同期的に取得するかではなく、それをいつどこで使用するかです。目標の方向性によって、初期化に使用する方法が決まります。もちろん、ほとんどの場合、Promise を使用することをお勧めします。