我有一个用于缓存产品数组的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请求并且返回的数据不是被动的。
答案 0 :(得分: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
过滤器并应创建自己的参数。看看文档。
答案 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,以便我们更好地看到问题。