0

コントローラーが実行を開始する前に、アプリケーション サービスを初期化しようとしています。

最初に約束を返す関数を解決することでこれを達成できると思っていたでしょう:

va.config(['$routeProvider', function($routeProvider) {
$routeProvider.
    when('/', {templateUrl: '../partials/home.php',   controller: 'VaCtrl',resolve: {
        pp: vac.loadData
    }});
}]);


var  vac = va.controller('VaCtrl',function($scope,$http,$q,packingProvider){
    console.dir(packingProvider.data[2]); 
});


vac.loadData = function($http,$timeout,$q,packingProvider){

   $http.post('../sys/core/fetchPacking.php').then(function(promise){
        packingProvider.data = promise.data;

    });

    var defer = $q.defer();
    $timeout(function(){
        defer.resolve();
    },2000);
    return defer.promise;
};

ただし、Promise が解決される前にコントローラーがまだロードされているため、コンソールが叫びます。

未定義のプロパティ '2' を読み取ることができません

私に。

私は何を間違っていますか?

編集:

また、コントローラーは 2 回呼び出されたようです。最初は未定義の pacingProvider.data オブジェクトで、2 秒後にはすべて問題なく呼び出されます。

4

2 に答える 2

3

注:これで問題は解決しますが、この回答はおそらく正しい解決策です。

サービスは常にコントローラーの前に初期化されます。問題は、あなたが述べたように、あなたの約束がまだ実現していないことです。そのための最善の選択肢は、約束を守ることです。

オブジェクトを公開する代わりにdata、promise を公開して使用します。

vac.loadData = function($http,$timeout,$q,packingProvider){
  packingProvider.data = $http.post('../sys/core/fetchPacking.php');
  return packingProvider.data;
};

そして、コントローラーでは、常にプロミスに添付され、最初の解決の後、次のティックで解決されます。

var  vac = va.controller('VaCtrl',function($scope,$http,$q,packingProvider){
  packingProvider.data.then(function(value) {
    console.dir(value[2]);
  }); 
});
于 2013-10-10T14:56:55.340 に答える