0

私のアプリ定義には次のものがあります。

var myVtModule = angular.module('vtApp', ['myAppDev','mongoAPI']);
myVtModule.run(function($rootScope, $location, Shop){
    $rootScope.shopData = {};
    Shop.getShop(function(response){
        $rootScope.shopData = response;
    });
})

Shop はサーバーからデータを取得するサービスであり、機能します。問題は、コントローラーで常に shopData にアクセスできるとは限らず、空の場合もあれば、正常に動作していることもあります。

function SupportCtrl($rootScope, $scope) {
    console.log ($rootScope.shopData);
}

サービスからの応答を受信したときに更新されないのはなぜですか? どこでも必要なため、Shop.getShop をコントローラーに配置することはできません...

4

3 に答える 3

1

私の提案は、コントローラーの継承とサービスを使用して、子コントローラーが常にショップにアクセスできるようにすることです。ここにデモがあります:

http://beta.plnkr.co/edit/DtjwLMi3jHCdzTheEJDNn?p=preview

コード:

angular.module('myApp', ['myApp.services']);

function MainCtrl($scope, ShopService) {
   $scope.shop = ShopService.getShop();
}
function ChildCtrl($scope) {
}
angular.module('myApp.services', []).
    factory('ShopService', function ($rootScope) {
        var shop = {
          storename: 'your store'
        };

        var service = {
              getShop: function() {
                return shop;
              }
        }

        return service;
    });

子コントローラの関係を設定する HTML:

<html ng-app="myApp" >
<head>
  <meta charset="utf-8">
  <title>AngularJS Plunker</title>
  <link rel="stylesheet" href="style.css">
  <script>document.write("<base href=\"" + document.location + "\" />");</script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js"></script>
  <script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
   The store is {{shop.storename}}
  <div ng-controller="ChildCtrl">
      The store name is: {{shop.storename}}

  </div>
</body>
</html>

shop親スコープがそれを取得したため、子が を使用できることがわかります。サービスをセットアップして、テスト可能にすることができます/など。継承に加えて、ShopService各コントローラーに を簡単に挿入して呼び出しを行うこともできますが、コントローラーが多数ある場合は面倒になる可能性があります。

スコープの継承に関する詳細情報:

親コントローラの変数を継承できますか? http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller

于 2013-04-25T16:07:39.127 に答える
0

コントローラーで結果が必要な場合は、スキップmyVtModule.runして代わりに次のようにする必要があります。

function SupportCtrl($scope, Shop) {
  Shop.getShop(function(response){
    console.log (response);
    //do something, put response in $scope or $scope.$rootScope etc...
  });
}
于 2013-04-25T14:00:22.093 に答える