2016-12-10 11 views
0

を使用して、すべての繰り返しで関数を呼び出す:(1-Nのカーディナリティを持つ)カテゴリー< --->製品私は次のような関係を持ってNGリピート

これは中NGリピートディレクティブです毎回リピートリストカテゴリは、このカテゴリはgetAllProductsByCategory()機能にすぐに送信され、その後、$ HTTPサービスは、すべての製品を取得する際、HTMLテーブル

<tr ng-repeat="category in categories"> 
    <td>{{category.name}}</td> 
    <td>{{products[category.id]}}</td> 
</tr> 

だから、私は何をする必要があるかでありますこの特定のカテゴリに属する​​。

機能を実行するためにng-initディレクティブを使用しようとしましたが、それを使用する正しい方法ではないと思います。それを行うより良い方法はありますか?

<tr ng-repeat="category in categories" ng-init="getAllProductsByCategory(category)"> 
    <td>{{category.name}}</td> 
    <td>{{products[category.id]}}</td> 
</tr> 

そして、これがNG-initが最初ではないカテゴリ毎に一度だけ実行されますカテゴリ

$scope.getAllProductsByCategory = function(category){ 
$http("getAlProductsByCategory"+category.id){ 
    .success(function (data, status, headers, config) { 
     $scope.products[category.id] = data; 
    }) 
    .error(function (data, status, header, config){ 
     $log.error("Error"); 
    }); 
} 

答えて

0

ですべての製品を取得する関数です。

<tr ng-repeat="category in categories"> 
    <td>{{category.name}}</td> 
    <td>{{products[category.id]}}</td> 
    <script type="text/javascript"> 
     getAllProductsByCategory({{category}}); 
    </script> 
</tr> 

ではなく、パフォーマンスの観点から悪い各カテゴリのために一度呼び出すのでは、これを行うための簡単な方法は、作成など、あります 私はあなたが何をしようとしているが、このだと思いますあなたがそれらを使用したいと思うもののためにそれらを準備しているコントローラーでそれらを一度呼び出すだけです。私はgetAllProductsByCategoryにすべてのオブジェクトを渡すために、コントローラ内の配列を分割する方法がわからない

+0

ありがとうございます。しかし、すべてのオブジェクトをgetAllProductsByCategory(カテゴリ)に渡すために、コントローラで配列を分割する方法がわかりません。関連する例を私に教えてください。 – wilson

+0

カテゴリは既に配列ではありませんか?または、少なくともlodash https://lodash.com/のようなもので、各要素のために何かを呼び出すことができる列挙型ですが、私の指摘は、関数を呼び出すと、すべての製品を一度に返す関数を呼び出す必要がありました。各カテゴリごとに投稿し、そこからオーバーヘッドを取得します。 2000カテゴリがあるとします。あなたは本当にサーバーへの2000回の呼び出しを行いますか? – TigOldBitties

+0

このコードをご覧くださいhttp://plnkr.co/edit/KMz09pJORmtflcl948kU?p=preview – wilson

1

(カテゴリ)

私は、非同期APIへの呼び出しを行うためにng-initを使用することはお勧めしません。 。モデルビューでは、どのようなアーキテクチャであれ、モデルはビューを駆動するはずです。ビューはモデルを駆動すべきではありません。ビューは、コントローラのユーザ入力イベントを収集できます。コントローラは、必要に応じてこれらのイベントを使用して、非同期APIを使用してモデルを更新することができます。

この場合、カテゴリのリストはおそらくasynch APIから来ている可能性があり、各カテゴリの製品はasynch APIから来る必要があります。これはchaining promisesとすることができます。

まず約束カテゴリを作成:その約束から今

var categoriesPromise = $http.get(categoriesUrl) 
    .then(function (response) { 
    var categories = response.data; 
    $scope.categories = categories; 
    //return to chain categories 
    return categories; 
}).catch(function (error) { 
    console.log("ERROR: ", error.status); 
    //throw to chain rejection 
    throw error; 
}); 

チェーン:詳細については

$scope.products = {}; 

var productsPromise = categoriesPromise.then(function(categories) { 
    var promiseHash = {}; 
    categories.foreach(function(c) { 
     promiseHash[c.id] = getProductsByCategory(c) 
      .then(function(products) { 
      $scope.products[c.id] = products; 
      //return data for chaining 
      return products; 
     }); 
    }); 
    //return $q.all promise for chaining 
    return $q.all(promiseHash); 
}); 

を、

+0

遅延の質問には申し訳ありませんこんにちは、私は第二約束で少し問題を抱えているが、私はここで、「getAlProductsByCategory」+ category.id」要求を置くことになっているかわからない。あなたが知っているように、私は電話をかける必要があります私は次のエラーがあります。https://k60.kn3.net/8/1/D/2/0/8/4BB.png何か考えていますか?ありがとう。 – wilson

+0

こんにちは、上記の質問がありましたか? 'getProductsByCategory'関数を作成 – wilson

+0

はexeciseは、読者のために残されている。' categoriesPromise'のための$ HTTP呼び出しの例に従ってください。 '.then'と' .catch'メソッドを使用してください。** **使用しないでください ' .success'メソッドと '.error'メソッドは戻り値**を無視するので、非推奨となりAngularJS 1.6から削除されました。 – georgeawg

関連する問題