【问题标题】:ng-repeat not updating using $scope.$watchng-repeat 不使用 $scope.$watch 更新
【发布时间】:2013-06-25 14:31:25
【问题描述】:

我需要一些帮助来显示来自 $watch 的 ng-repeat 指令中的更新结果

  • ProductsCtrl 正在监视产品类型的变化,当它检测到变化时,它会搜索该类型的产品。
  • 这肯定会检测到产品类型更改,并且我从 updateProducts 函数返回结果,但我返回的产品未显示。
  • 我认为将 $scope.productService.products 映射到 ProductService.products 意味着它会自动更新。

我错过了什么吗?

谢谢。

controllers.js

.controller('ProductsCtrl',['$scope','ProductService', '$location', 'SessionDataService',    function($scope, ProductService, $location, SessionDataService){

  $scope.productService = ProductService;
  $scope.productService.products = ProductService.products;
  $scope.sessionDataService = SessionDataService;
  $scope.productType = SessionDataService.productType;

  $scope.$watch('productType', function(productTypeNew, productTypeOld){
      //update products
        console.log('ProductsCtrl: watch : New Val - '+ productTypeNew + ',     Old Val - ' + productTypeOld);
        $scope.productService.updateProducts(productTypeNew);
        console.log("ProductsCtrl: watch : Products retrieved - " +         $scope.productService.products);        
}, true);

}]);   

services.js

.factory('Product',['$resource', function($resource){
return $resource('/products/:id', {
    id: '@id'
});
}])
.factory('ProductService', ['Product', function(Product){
var products = [];

function updateProducts(productType){
    console.log("ProductService updateProducts with product type " + productType);
        Product.query({product_type: productType},
        function (data) {
            console.log("ProductService updateProducts returned " + data);
              var retProducts = data;
              angular.copy(retProducts, products);
              //console.log(retProducts);
            });
}
return {

    products: products,
    updateProducts: updateProducts

}}])

html

<div ng-controller="ProductsCtrl">
        <tr ng-repeat="product in productService.products">
            <td>{{product.title}}</td>
            <td>{{product.retailler}}</td>
        </tr>
    </div>

【问题讨论】:

    标签: angularjs angularjs-scope angularjs-ng-repeat angularjs-service angularjs-controller


    【解决方案1】:

    如果其他人遇到这种情况或有人可以解释原因 - 答案是将整个表格元素封装在控制器中,而不仅仅是 ng-repeat

    解决方案:

    <div ng-controller="ProductsCtrl">
        <table>
            <tr>
                <th>Product</th>
                <th>Retailler</th>
            </tr>
    
            <tr ng-repeat="product in products">
                <td>{{product.title}}</td>
                <td>{{product.retailler}}</td>
            </tr>
        </table>
        </div>
    

    【讨论】:

      【解决方案2】:

      所以看起来console.log(retProducts); 确实打印了新值,但您的屏幕没有刷新。我认为这是因为您的复制代码在 $apply 中,所以您的复制后没有 $digest。我会将您的 angular.copy 包装在 $apply 中:

      .factory('ProductService', ['Product', '$rootScope', function(Product){
      var products = [];
      
      function updateProducts(productType){
          console.log("ProductService updateProducts with product type " + productType);
              Product.query({product_type: productType},
              function (data) {$rootScope.$apply(function() {
                  console.log("ProductService updateProducts returned " + data);
                    var retProducts = data;
                    angular.copy(retProducts, products);
                    //console.log(retProducts);
                  })});
      }
      return {
      
          products: products,
          updateProducts: updateProducts
      
      }}])
      

      【讨论】:

      • 谢谢 - 我之前确实尝试过,但出现错误:$digest already in progress
      • @createsomevalue 伤心。你可以在 angular.copy 之后 console.log(products) 吗?看起来对吗?
      • @createsomevalue 另外,我会安装 Batarang (chrome.google.com/webstore/detail/angularjs-batarang/…) 以查看您的范围是否真的改变了。
      • Batarang 看起来真的很有用。我为应用程序的另一部分采用了相同的架构,并且可以找到它。唯一的区别是我在 $watch 中为此进行了更新。使用 batarang 我可以在 AngularJS 属性中看到产品,所以我不知道为什么它们没有显示。
      • 我已经弄清楚为什么会发生这种情况。 ng-controller='ProductsCtrl' 需要封装整个表格元素,而不仅仅是结果。当我被允许时会发布答案。
      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2015-12-11
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多