これは少し広い質問なので、簡潔にするよう努めます。
アプリケーションのインポート手順に取り組んでいるときに、次のデータ構造に出くわしました。
[
{
type: foreignParent,
children: [
{
type: foreignChild
imported: true|false
},
{
type: foreignChild
imported: true|false
}
]
}
]
親のリストは 1 つの API 呼び出しによって提供され、その親の子のリストは、各親 (1+n) ごとに追加の API 呼び出しによって提供され、オブジェクトにimported
何かが存在するかどうかに基づいて値が変化します。localChildren
プラットフォームに既にインポートされているもの。foreignParent
、foreignChild
およびlocalChild
は、3 つの異なるサービスによって提供される異なる構造を持つ 3 つの異なるオブジェクトです。
問題は、このコントローラ アクションに含まれる 3 つのサービスを使用して 1 つの大きなオブジェクトの配列を構築し、単純に次のように反復する方がよいかどうかですng-repeat
。
<ul>
<li ng-repeat="p in foreignParents">
<ul>
<li ng-repeat="c in p.children">
{{c.imported ? 'Imported' : 'Not Imported'}}
</li>
</ul>
</li>
</ul>
その場合、サービス内のオブジェクトのリストが変更された場合は、ウォッチャーをセットアップしてハッシュを調べ、インポートされた値を再計算しlocalChildren
、さらにオブジェクトを追跡する必要があります。
imported
2 番目のオプションは、およびプロパティに関数を割り当てるように思われますchildren
。これは、ダイジェスト サイクルごとに計算されると思います。
<ul>
<li ng-repeat="p in foreignParents">
<ul>
<li ng-repeat="c in p.children()">
{{c.imported() ? 'Imported' : 'Not Imported'}}
</li>
</ul>
</li>
</ul>
より単純な 3 番目のオプションは、関数プロパティのないネイティブ オブジェクトを持ち、コントローラーに関数を配置することです。
<ul>
<li ng-repeat="p in foreignParents">
<ul>
<li ng-repeat="getChildren(p)">
{{isImported(c) ? 'Imported' : 'Not Imported'}}
</li>
</ul>
</li>
</ul>
現在、コントローラーは多かれ少なかれ次のようになっています。
app.controller('ImportCtrl', function ($scope, foreignParent, foreignChild, localChild) {
$scope.foreignParents = [];
$scope.githubRepositoryImported = function(repo) {
localChild.RefNameExists(repo.ref_name);
};
foreignParent.Get().then(function(collection){
_.each(collection.data, function(elem, i, list){
foreignChild.Get(elem.login).then(function(collection){
$scope.foreignParents[i].children = collection.data;
});
});
$scope.foreignParents = collection.data;
})
}]);
残念ながら、これは意図したとおりには機能しませんが、それは私の側のデータの問題によるものです。私はこれについて何人かの友人と話しましたが、これを行うための広く受け入れられている正しい方法が何であるかを誰も知りませんでした.
複数のサービスで構成されるこれらの複雑なネストされたリストの正しい方法論、またはリストが何回消化されているか、関数の結果の変更がどのように伝播されるかを確認する方法がどれなのか、私にはわかりません。場合によっては、明示的$scope.$watch
または強制$scope.$digest
に . 適切な比較を行うのに十分なほど複雑なサンプル アプリを実際に見つけたことがありません。