【问题标题】:Angular $scope object not updating in view角度 $scope 对象未在视图中更新
【发布时间】:2015-11-23 11:54:28
【问题描述】:

我有一个根据类别过滤的大型产品对象。选择过滤器后,我拥有的 getAllProducts() 函数将使用该过滤器调用。这个函数还设置了$scope.products,在我看来,ng-repeat<li>

选择每个类别后,我在控制台记录返回的产品对象的长度,并看到该对象正确更新,但我的视图没有改变。有人看到这里出了什么问题吗?

查看:

  <li ng-repeat="product in products track by $index">
      <img ng-model="category" class="{{product.custom.category_code}}" src="/img/product-all/{{product.custom.sku}}PF1.png">
      <p class="name">{{product.custom.name1}}</p>
      <p class="price">{{product.price}}</p>
  </li>

  <li class='has-sub first-menu'><a href='/scroll'><span>Filter By Category:</span></a>
     <ul class="sub-menu">
        <li ng-repeat="cat in filterCategory">
           <a href='/scroll' data-category="all" ng-click="setFilter('category', cat)">
              <span>{{cat}}</span>
           </a>
        </li>
     </ul>
  </li>
  <li class='has-sub first-menu'><a href='/scroll'><span>Filter By Color:</span></a>
     <ul class="sub-menu">
        <li ng-repeat="color in filterColor">
           <a href='/scroll' data-category="all" ng-click="setFilter('color', color)">
              <span>{{color}}</span>
           </a>
        </li>
     </ul>
  </li>
  <li class='has-sub first-menu'><a href='/scroll'><span>Filter By Season:</span></a>
     <ul class="sub-menu">
        <li ng-repeat="season in filterSeason">
           <a href='/scroll' data-category="all" ng-click="setFilter('season', season)">
              <span>{{season}}</span>
           </a>
        </li>
     </ul>
  </li>

控制器:

    $scope.setFilter = function(type, filter){
        type = type;
        filter = filter;
        getProducts(type, filter);
    }
    var getProducts = function(type, filter){
        productFactory.getAllProducts()
            .then(function(){
                $timeout( function(){
                    var allProducts = productFactory.products;
                    var filterProducts;
                    switch (type){
                        case "category":
                            filterProducts = $filter('filter')(allProducts, {custom:{category_code:filter}});
                            break;
                        case "color":
                            filterProducts = $filter('filter')(allProducts, {custom:{color_code:filter}});
                            break;
                        case "season":
                            filterProducts = $filter('filter')(allProducts, {custom:{season:filter}});
                            break;
                        default:
                            filterProducts = productFactory.products;
                    }
                    $scope.products = _.uniq(filterProducts, function(p){ return p.custom.sku; });
                    console.log($scope.products.length);
                }, 700);
            });
    }

工厂:

var getAllProducts = function(){
        return $http.get('/api/scroll?page='+pageNumber)
            .then(function(response) {
                angular.extend(products,response);
                for (var i = products.data.results.length - 1; i >= 0; i--) {
                    productsData.push(products.data.results[i]);
                };
                while (pageNumber <= products.data.pages){
                    getAllProducts();
                    pageNumber++;
                }
                for (var i = productsData.length - 1; i >= 0; i--) {
                    if (filterCategory.indexOf(productsData[i].custom.category_code) == -1) {
                        filterCategory.push(productsData[i].custom.category_code);
                    };
                    if (filterColor.indexOf(productsData[i].custom.color_code) == -1) {
                        filterColor.push(productsData[i].custom.color_code);
                        // $filter('orderBy')(filterColor, '+');
                    };
                    if (filterSeason.indexOf(productsData[i].custom.season) == -1) {
                        filterSeason.push(productsData[i].custom.season);
                    };
                };
                var deferred = $q.defer();
                deferred.resolve(response);
                products = productsData;
                return deferred.promise;

            });
    };

【问题讨论】:

  • 你能添加你的getAllProducts工厂方法代码吗?
  • 您是否尝试删除track by $index
  • @bumpy 是的,没有改变任何东西
  • @PankajParkar 刚刚添加

标签: javascript angularjs scope angularjs-scope


【解决方案1】:

似乎您错过了从服务方法返回数据,它应该返回格式化数据。当您已经使用正在返回承诺的$http 时,无需再次创建承诺。

然后在您的控制器内部getAllProducts().then 函数参数将包含从服务方法返回的数据。

工厂

var getAllProducts = function() {
    return $http.get('/api/scroll?page=' + pageNumber)
    .then(function(response) {
      angular.extend(products, response);
      for (var i = products.data.results.length - 1; i >= 0; i--) {
        productsData.push(products.data.results[i]);
      };
      while (pageNumber <= products.data.pages) {
        getAllProducts();
        pageNumber++;
      }
      for (var i = productsData.length - 1; i >= 0; i--) {
        if (filterCategory.indexOf(productsData[i].custom.category_code) == -1) {
          filterCategory.push(productsData[i].custom.category_code);
        };
        if (filterColor.indexOf(productsData[i].custom.color_code) == -1) {
          filterColor.push(productsData[i].custom.color_code);
          // $filter('orderBy')(filterColor, '+');
        };
        if (filterSeason.indexOf(productsData[i].custom.season) == -1) {
          filterSeason.push(productsData[i].custom.season);
        };
      };
      return productsData; //return data from here

    });
};

控制器

var getProducts = function(type, filter) {
  productFactory.getAllProducts()
  .then(function(products) { //<--added data parameter here
    var allProducts = products; //<--assigned data to all products
    var filterProducts;
    switch (type) {
      case "category":
        filterProducts = $filter('filter')(allProducts, {
          custom: {category_code: filter}
        });
        break;
      case "color":
        filterProducts = $filter('filter')(allProducts, {
          custom: {color_code: filter}
        });
        break;
      case "season":
        filterProducts = $filter('filter')(allProducts, {
          custom: {season: filter}
        });
        break;
      default:
        filterProducts = productFactory.products;
    }
    $scope.products = _.uniq(filterProducts, function(p) {
      return p.custom.sku;
    });
    console.log($scope.products.length);
  });
}

【讨论】:

  • 感谢您的帮助,Pankaj,但这仍然没有更新我的观点。这些功能像以前一样工作,但我的观点再次没有按预期响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多