Angular在控制器中使用$ cacheFactory数据

时间:2013-03-04 12:41:34

标签: angularjs

我有一个用于缓存产品数组的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请求并且返回的数据不是被动的。

2 个答案:

答案 0 :(得分:1)

正确的方法是使用过滤器文档herehere

假设您编写的过滤器是模拟的,并且您需要一个复杂的过滤器,您只需在$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过滤器并应创建自己的参数。看看文档。

答案 1 :(得分: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,但我不确定这会解决您的问题。如果没有,请发布一个plunker,以便我们更好地看到问题。