2017-09-19 9 views
0

私は、次のHTMLコードを持って、そのNG-ショーはNGリピートと同じデータにアクセスする必要が気づく:私は二回getFilteredQuestions()を呼び出していますし、それが必要キャッシュ値

<div ng-repeat="cat in getSelectedCategories()"> 

     <div ng-show="getFilteredQuestions(cat).hasItems"> 

      <div ng-repeat="(promptId, q) in getFilteredQuestions(cat).val"> 

        // nested loop contents 
      </div> 
     </div> 
    </div> 

予告まったく同じデータを生成します。実際には、ディスプレイを一貫させたい場合は、まったく同じデータを生成する必要があります。 AngularJSは通常この呼び出しをキャッシュしていますか、同じループで2回使用しているので値をキャッシュするために使用できるトリックがあります。

getFilteredQuestions()には、$scopeにキャッシュされた値を設定し、getFilteredQuestions()を呼び出す代わりに、キャッシュされた値を内部ループで読み取ることが考えられます。

+1

いいえ、ありません。$ digestサイクルごとに角括弧が実行され、式呼び出しの結果によってモデルが変更された場合、別の* '$ digest'サイクルが発生する可能性があります。すべての表現のしたがって、これはあなたのテンプレートに入れなければならない種類の論理ではありません。 – Claies

+0

私はClaiesに同意し、フィルタリングの他の方法を見つけようとする必要があります。そのようなテンプレートでインライン化を避けてください – alphapilgrim

+0

申し訳ありませんが、私は元の質問にいくつかの情報を追加しました。 –

答えて

0

キャッシュの値は、私が期待した通りにのように動作するようです。 (1)よりパフォーマンスが高い、(2)「無限ダイジェストサイクル」を回避する、(3)データの一貫性を保証する

基本的に、我々は代わりにOPに何を、今、これを持っている:

<div ng-repeat="cat in getSelectedCategories()"> 

     <div ng-show="getFilteredQuestions(cat)"> 

      <div ng-repeat="(promptId, q) in getFilteredQuestionsCache(cat)"> 

        // nested loop contents 
      </div> 
     </div> 
    </div> 

予告2回目の呼び出しはgetFilteredQuestions() but to getFilteredQuestionsCache() `にではありません。

getFilteredQuestions()が呼び出されたときに、それはそうのようなコントローラのキャッシュプロパティを更新します。

$scope.getFilteredQuestions = function(){ 

    // ... 
    $scope.filteredQuestionsCache[cat] = obj; //update the cache 
    return Object.keys(obj).length > 0; // for the ng-show decision 
}; 

getFilteredQuestionsCache()はそうのようなものです:

このように
$scope.getFilteredQuestionsCache = function (cat) { 
    return $scope.filteredQuestionsCache[cat]; 
    }; 

、NG-ショーとng- repeat同じデータを取得するために呼び出しを繰り返さないでください。

関連する問題