2013-03-04 50 views
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请求正在处理和返回的数据不具有反应性。

回答

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过滤器,并应自行创建。看看文档。

0

没有用于绑定的HTML代码,要确定如何使用$ scope.related函数有点困难。然而,如果你遇到的唯一问题是,当数据从xhr请求返回时,UI不会更新,那么很可能您的$ digest阶段已经结束,因此绑定到$ scope.related不是导致该功能重新启动,直到下一个$摘要阶段。

这可能会上班,以处理您遇到的问题:

... 
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,我不知道,这将解决您的问题。如果不是的话,发布一个活塞,这样我们可以更好地看到问题。