2017-02-08 4 views
0

私は、データベースにアクセスするためにRestangularを使用するAngularjsプロジェクトを持っています。私は3つのデータ層(mydata、mysubdata、mysubsubdataなど)を持っており、各層の間には1対多の関係があります。私の問題は、表示のために、私はmysubsubdataをmysubdataに連結する必要があるということです。私がデータベースからデータを取り戻そうとすると、私はループ内で関数を持つことができないというコンパイラの不満をぶつけています。ここで私が何をしようとしていますものです:.then内部のループの中でどのように関数を使うのですか?

DataService.one(mydata.id).getList('mysubdata') 
.then(function(data) { 
    var dataList = data; 
    for (returnedData in dataList) { 
    DataService.one(mydata.id).one('mysubdata',returnedData.id).getList('mysubsubdata') 
    .then(returnedSubData) { 
     dataList = angular.extend(dataList, returnedSubData); 
    }); 
    } 
}); 

私が見つけたすべての例は.then関数内のループを持っているか、バック最初の約束の束を取得しようとしています。私はそれらが当てはまるとは思わない。私はまだAngularには新しく、だから私はちょっとフレキシブルかもしれない。どちらも延長についてはわかりませんが、それはおそらく別の質問です。

編集:これは$ q.allで行うべきだと思われますが、まだ方法を把握していません。

+0

私は「約束」を返す必要があります。 – jdmdevdotnet

+0

明確にするために、DataServiceはRestangularを使用しています。最初の部分(2番目のDataServiceまで)は正常に機能します。それを説明してくれないのは残念です。 –

+0

サイクル内でクロージャを作成しようとしましたか? –

答えて

0

ループ内にthen()メソッドを追加することは、ループが約束を解決するのを待たないという単純な理由のために機能しません。あなたは再帰的な方法を使ってこれを達成することができます。

var myCustomData = null, 
    dataList = null, 
    dataListCounter = 0; 

DataService.one(mydata.id).getList('mysubdata') 
    .then(function (data){ 
    dataList = data; 
    myCustomData = mydata; 
    $scope.getSubSubData(); 
}); 

$scope.getSubSubData = function() { 
    if (dataList.length >= dataListCounter) 
    return; 
    DataService.one(myCustomData.id).one('mysubdata',dataList[dataListCounter].id).getList('mysubsubdata') 
    .then(function (returnedSubData) { 
     dataList = angular.extend(dataList, returnedSubData); 
     dataListCounter++; 
     $scope.getSubSubData(); 
    }); 
}; 

これが役立つかどうかお知らせください。

+0

DataServiceコールでエラーが発生したようですので、修正しています。私はあなたの答えを試しています。注意してください、ifには中括弧を追加する必要がありました。 –

+0

これはまだ動作していません。 getSubSubDataピースが呼び出されていないようです。私がそれを踏むと、getSubSubData行がヒットしたように見えますが、関数内のブレークポイントは決してヒットしません。このコードはコントローラではなくサービスの内部にあることに注意してください。 –

+0

あなたはフィドルを提供できますか? –

0

@Anadi Sharmaの応答に対するマイナーな修正。

$scope.getSubSubData = function() { 
    if (dataList.length == dataListCounter) 
    return; 
    DataService.one(myCustomData.id).one('mysubdata',dataList[dataListCounter].id).getList('mysubsubdata') 
    .then(function (returnedSubData) { 
     dataList[dataListCounter].mysubsubdata = returnedSubData; 
     dataListCounter++; 
     $scope.getSubSubData(); 
    }); 
}; 

サブデータ値を連結するためのデータを表示すると、フィルタを使用することに注意してください。

関連する問題