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,但我不确定这是否能解决您的问题。如果没有,请发布一个 plunker,以便我们更好地看到问题。

于 2013-03-04T13:49:10.300 回答