2015-11-13 4 views
0

Я новичок в Угловое, и, возможно, я не понимаю все об обещании, так что ... У меня есть ресурс заводУгловая неопределенное обещание

.factory('Product',["$resource", function ($resource){ 
    var Resource = $resource(
     "/api/product/:product_id/", 
     {product_id: '@id'}, 
     { 
      query: { 
       isArray: true, 
       transformResponse: function (data) { 
        var items = angular.fromJson(data); 
        return items.results; 
       } 
      }, 
      update: { 
       method: "PUT", 
      } 
     }, 
     { 
      stripTrailingSlashes: false 
     } 
); 

И в моем другом заводе.

.factory('Get',["$http", "Product", function ($http, Product){ 
    return { 
     getDesc: function(id){ 
      var allProducts = Product.query(); 
      var products = []; 
      for (var i = 0; i < allProducts.length; i++){ 
       if(allProducts[i].desc == id){ 
        products.push(allProducts[i]); 
       } 
      } 
      return products; 
     } 
    } 
}]) 

И в моем контроллере

$scope.someClick = function(product){ 
     var products = Get.getDesc(product.id); 
     products.$promise.then(function(data){ 
      $log.log(data); 
     }); 
}; 

И я получил: Ошибка. Г $ обещание не определено я не знаю, почему. Не могли бы вы помочь мне?

ответ

0

Есть несколько проблем с кодом. В частности, с обещанием: Метод запроса возвращает ресурс, содержащий в себе $ prom. поэтому вы можете сделать одно из следующего: 1. Верните обещание и выполните обработку, фильтрацию (подробнее об этом позже) в контроллере. 2. Используйте .Затем на обещание сделать фильтрацию и вернуть это обещание:

getDesc: function(id){ 
     var allProductsPromise = Product.query().$promise; 
     return allProductsPromise.then(function(response){ 
      var products = []; 
      for (var i = 0; i < response.length; i++){ 
       if(response[i].desc == id){ 
        products.push(response[i]); 
       } 
      } 
      return products; 
     }); 
    } 

Другой вопрос, который я вижу, это двойная фильтрация. Поскольку ваш запрос принимает идентификатор, я предполагаю, что вы получите только соответствующий продукт. Почему вы должны фильтровать результаты (итерация и сравнение id)? Если мое наблюдение верное, вам может не понадобиться блок фильтрации, и вы можете сразу вернуться к первоначальному обещанию.

+0

Благодарим за ответ. Эта фильтрация будет более сложной. Например, первая модель имеет foreignKey для другой модели, и я буду фильтровать этот FK и т. Д. PS. Что делать, если мне нужно отфильтровать другие данные на этой фабрике, используя эти более ранние данные с фильтрацией (Продукты)? – Jeroj82

+0

В основном, обработчики обещаний привязаны и используются в качестве фильтров/трансформаторов. Возвращаемое значение первого обработчика передается следующему обработчику и так далее. Вот почему важно возвращать значение для каждого обработчика. Сказав, что вы можете реализовать свой логин в обработчиках вашего приложения (перед возвратом обещания). Подумайте о заказе. Вы получаете базовый заказ и должны добавлять различные налоги и издержки: getPrice: function() {return Price.get(). Then (addCommision). Then (addTax). Then (addInsurance); }. Следующий обработчик (.then (myHandler)) увидит сложенную цену – Meir

Смежные вопросы