2014-10-09 1 views
2

Я новичок в AngularJS. Я делаю пример из книги Pro AngularJS Адама Фримена, но застрял в этой ошибке.

Error: [$injector:pget] Provider 'function()' must define $get factory method. 

Я нахожусь в точке, где мне нужно создать виджет корзины и общий частичный вид. Выше ошибка возникает, когда AngularJS пытается загрузить модуль Cart.

Вот частичное сообщение об ошибке от инструментов разработчика Chrome. На данный момент автор ничего не говорит о функции $ get или провайдере. Не уверен, что я делаю неправильно. Пожалуйста помоги.

Uncaught Error: [$injector:modulerr] Failed to instantiate module sportsStore due to: 
Error: [$injector:modulerr] Failed to instantiate module cart due to: 
Error: [$injector:pget] Provider 'function()' must define $get factory method. 
http://errors.angularjs.org/1.2.23/$injector/pget?p0=function%20() 

Код виджета для корзины.

angular.module("cart", []) 
.factory(function() { 

    var cartData = []; 

    return { 

    addProduct: function (id, name, price) { 
     var addedToExistingItem = false; 
     for (var i = 0; i < cartData.length; i++) { 
      if (cartData[i].id == id) { 
       cartData[i].count++; 
       addedToExistingItem = true; 
       break; 
      } 
     } 
     if (!addedToExistingItem) { 
      cartData.push({ 
       count: 1, id: id, price: price, name: name 
      }); 
     } 
    }, 

    removeProduct: function (id) { 
     for (var i = 0; i < cartData.length; i++) { 
      if (cartData[i].id == id) { 
       cartData.splice(i, 1); 
       break; 
      } 
     } 
    }, 

     getProducts: function() { 
      return cartData; 
     } 
    } 
}) 
.directive("cartSummary", function (cart) { 
    return { 
     restrict: "E", 
     templateUrl: "components/cart/cartSummary.html", 
     controller: function ($scope) { 

      var cartData = cart.getProducts(); 

      $scope.total = function() { 
       var total = 0; 
       for (var i = 0; i < cartData.length; i++) { 
        total += (cartData[i].price * cartData[i].count); 
       } 
       return total; 
      } 

      $scope.itemCount = function() { 
       var total = 0; 
       for (var i = 0; i < cartData.length; i++) { 
        total += cartData[i].count; 
       } 
       return total; 
      } 
     } 
    } 
}); 

вот как он вызывался из app.html

<script> 
    angular.module("sportsStore", ["customFilters", "cart"]); 
</script> 
<script src="controllers/sportsStore.js"></script> 
<script src="filters/customFilters.js"></script> 
<script src="controllers/productListControllers.js"></script> 
<script src="components/cart/cart.js"></script> 

....

<body ng-controller="sportsStoreCtrl"> 
    <div class="navbar navbar-inverse"> 
     <a class="navbar-brand" href="#">SPORTS STORE</a> 
     <cart-summary /> 
    </div> 
    <div class="alert alert-danger" ng-show="data.error"> 
     Error ({{data.error.status}}). The product was not loaded. 
     <a href="/sportsstore/app.html" class="alert-link">Click here to try again</a> 
    </div> 
    <ng-include src="'views/productList.html'" /> 
</body> 

SportsStore модуль кода ..

angular.module("sportsStore") 
    .constant("dataUrl", "http://localhost:5500/products") 
    .controller("sportsStoreCtrl", function ($scope, $http, dataUrl) { 

     $scope.data = {} 
     $http.get(dataUrl) 
      .success(function (data) { 
       $scope.data.products = data; 
      }) 
      .error(function (error) { 
       $scope.data.error = error; 
      }); 
}); 
+0

Можете ли вы разместить код для модуля sportstore? – sma

+0

Добавлен код модуля sportStore. – Pak

+0

Я делал глупую ошибку. Я пропустил первый аргумент из следующего вызова функции. .factory («cart», function(). Но когда я разместил вопрос, я взял его из неправильного местоположения в своем приложении, что было правильно. Я действительно извиняюсь за это. Я обновлю опубликованный код, чтобы он отражал – Pak

ответ

1

У вас есть модуль, определенный как «корзину» где-то, похоже, что может быть проблема с ссылками на «телегу» в модуле, когда вы пытаются определить фабрику. Если вы пытаетесь ссылаться на ваше основное приложение попробовать что-то вроде:

var main = angular.module("sportsStore", ['cart'])... 

Затем определить ваши телеги заводского попробовать:

main.factory('cart', function() {... cart factory code here...}) 
+0

Спасибо за помощь. – Pak

0

попробовать этот удалить в модуле [] и ваше имя модуля не телега корзина изменение sportsStore

 angular.module("sportsStore") 
.factory("cart", function() {  ... }) 
+0

Привет, Арутюн, на самом деле я не делаю никаких http-вызовов из этой функции. Я обновил код выше. – Pak

+0

Код ящика с кодом –

+0

Я обновил код. Попробуйте это –

0

Тест код для файла cart.js как ваш отличаются от как это находится в книге:

angular.module("cart", [])  
.factory("cart", function() {...} 
Смежные вопросы