0

製品配列をキャッシュするために使用される ProdCache サービスがあります。

...
var products = ProdCache.get('all');
if(typeof products == 'undefined'){
    products = Product.query();
    ProdCache.put('all',products);
}

商品をスコープに入れると、商品は期待どおりに表示されますが、表示する必要があるのは数個の商品だけです。
私の試み:

$scope.related = (function(){
    var res = [];
    if(products.length>0){
        for (var i = 0, key; i < 3; i++) {
            key = Math.floor(Math.random() * products.length);
            res.push(products[key]);
        }
    }
    return res;
})();

xhr リクエストが処理されており、返されたデータが反応的でないため、その関数は初めて機能しません。

4

2 に答える 2

1

適切な方法は、こちらこちらのフィルター ドキュメントを使用することです。

作成したフィルターがモックであり、複雑なフィルターが必要であると仮定すると、フィルター関数を作成して式$scopeで参照するだけです。ng-repeat

$scope.isRelated = function isRelatedFilter(item) {
  // if return is true, the item is included.
  return item.someProperty === 'someCriteria';
}
<span ng-repeat="product in products | filter:isRelated">...</span>

これsomeCriteriaは、別の $scope/controller プロパティであるか、サービスによって定義されている可能性があります。カスタム パラメータが必要な場合は、filterフィルタを使用できないため、独自のパラメータを作成する必要があります。ドキュメントを見てください。

于 2013-03-04T13:28:02.923 に答える
0

バインドに使用している HTML コードがないと、$scope.related 関数をどのように使用しているかを判断するのが少し難しくなります。ただし、xhr リクエストからデータが返されたときに UI が更新されないことが唯一の問題である場合は、$digest フェーズがすでに終了しているため、$scope.related へのバインドが行われていない可能性があります。次の $digest フェーズまで関数を再起動させます。

これはおそらく、あなたが抱えている問題を処理するのに役立つでしょう:

...
var products = ProdCache.get('all');
if(typeof products == 'undefined'){
    products = Product.query();
    ProdCache.put('all',products);
    // Add this line to force re-digest if needed
    if(!$scope.$$phase) $scope.$digest();
}

ただし、HTML を見ないと、これで問題が解決するかどうかわかりません。そうでない場合は、プランカーを投稿して、問題をよりよく確認できるようにしてください。

于 2013-03-04T13:49:10.300 に答える