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

angular.js - angularjs中关于异步加载的数据在controller之间共享的问题?

app.factory('userService', ['$http', function ($http) {
         var userService= {},
                                    
         userService.getUsers = function () {                    
             return $http.get('getUsers');
         }     
         userService.users =[];                                       
         return userService;
 }]);

app.controller("FirstController",["$http","userService",function($http,userService){
       userService.getUsers().success(function (users){
           userService.users = users;//在SecondController得不到数据
       })
       //userService.users=[1,2,3] 如果我这样更新数据,在SecondController可以获得数组[1,2,3]

  }])
app.controller("SecondController",["$http","userService",function($http,userService){
   //userService.users 此得到的为空数组 
    //但是console.log(userService) 可以看到userService.users中有数据

  }])
某草草某草草2713日前545

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

  • PHPz

    PHPz2017-05-15 17:01:38

    $http リクエストは非同期操作です。SecondController を実行するとき、この時点でデータが取得されているという保証はありません。

    返事
    0
  • PHP中文网

    PHP中文网2017-05-15 17:01:38

    $http を独自のサービスに封印したい場合は、$q モードと Promise モードを理解する必要があります。この時点では、同期的思考を使用して非同期操作を実行することと同じです。

    返事
    0
  • 某草草

    某草草2017-05-15 17:01:38

    私たちのプロジェクトにはそのような問題がたくさんあります。私の現在の解決策について簡単に話しましょう。上記と同様に、サービスはカプセル化され、HTTP を使用してデータが返されると、データを必要とするすべてのコントローラーがこのサービスを使用してデータの整合性を確保します。

    返事
    0
  • 巴扎黑

    巴扎黑2017-05-15 17:01:38

    通常、サーバーをカプセル化する場合、基本的にPromiseが使用されます。 (推奨練習)

    質問者が Promise を使用したくない場合は、コールバックを使用することで問題を解決することもできます。

    もう 1 つのアイデアは、イベント通知を使用することです。サーバーがデータを取得すると、イベントを使用してコントローラーに通知します。

    返事
    0
  • 仅有的幸福

    仅有的幸福2017-05-15 17:01:38

    それはコールバックを使用して解決できると言われました。試してみたところ、うまくいきました。お役に立てば幸いです。

    send()は、最初のコントローラーの入力値を動的に取得するキーアップイベントです

    リーリー

    返事
    0
  • キャンセル返事