创建购物车应用我试图使用Angular将对象传递到服务功能。我接受了另一篇文章的建议,但由于某种原因,我仍然在页面加载时得到一个未提供的错误,并且由于一些奇怪的原因出现语法错误。错误似乎源于此:
<form class="cart nobottommargin clearfix" ng-submit="addToCart({{producto}})" novalidate >
控制器:
.controller('DetalleProductoController',
['$scope', '$stateParams', 'Productos', 'Carrito',
function ($scope, $stateParams, Productos, Carrito) {
// Recibir el producto por id pasado en el UI-router
var prod = Productos.findById($stateParams.id);
$scope.producto = prod;
//ng-click addToCart desde el factory
$scope.addToCart = Carrito.addToCart(prod);
}])
它实施的服务(缩短):
MyApp.service('Carrito', ['Productos', '$scope', '$http',
function (Productos, $scope, $http){
var carritoUsuario = [];
var todosLosProductos = Productos.todos();
this.addToCart = function(Prod) {};
非常感谢任何帮助...
编辑:这里的整个服务。也许我从根本上做错了什么?
MyApp.service('Carrito', ['Productos', '$scope', '$http',
function (Productos, $scope, $http){
var carritoUsuario = [];
var todosLosProductos = Productos.todos();
var unProducto = function() {
this.Nombre = "";
this.stockid = 0;
this.Descripcion = "";
this.Precio = 0;
this.Familia = 1;
this.Modificadores = [];
this.Cantidad = 1;
this.SKU = function () {return "" + this.stockid +
this.Modificadores.mod1 + this.Modificadores.mod2 +
this.Modificadores.mod3 + this.Modificadores.mod4 +
this.Modificadores.mod5};
}
/* For now this searches the local array */
this.findBySKU = function(sku) {
console.log("Finding: " + sku + " from Carrito service findBySKU...");
_.find(carritoUsuario, function (producto){
return producto.stockid == sku;
});
};
this.getProducto = function(id) {
console.log("Getting: " + id + " from Carrito service getProducto...");
Producto.findById(id);
};
this.getCart = function() {
console.log("Getting cart from Carrito service getCart");
carritoUsuario;
};
this.addToCart = function(Prod) {
/* Prod es un ng-model pasasdo por ng-click=addtoCart(producto)
en cualquier boton de compra. Hay que cargar los datos en el html */
console.log("Passed: " + Prod + " -- into Carrito.addToCart...");
unProducto.Nombre = Prod.Nombre;
unProducto.stockid = Prod.stockid;
unProducto.Descripcion = Prod.Descripcion;
unProducto.Precio = Prod.Precio;
unProducto.Familia = Prod.Familia;
unProducto.Cantidad = parseInt(Prod.cantidad);
unProducto.Modificadores = {
"mod1":Prod.mod1,
"mod2":Prod.mod2,
"mod3":Prod.mod3,
"mod4":Prod.mod4,
"mod5":Prod.mod5
};
unProducto.SKU = "" + Prod.stockid + Prod.mod1 + Prod.mod2 + Prod.mod3 + Prod.mod4 + Prod.mod5;
if(angular.isDefined(Carrito.findBySKU(unProducto.SKU))) {
var i = _.findIndex(this.carritoUsuario, unProducto.SKU);
Carrito.carritoUsuario[i].Cantidad++;
} else {
Carrito.carritoUsuario.push(unProducto);
console.log("Added: " + unProducto + " -- to the Carrito...");
}
};
this.totalCarrito = function() {
var total = 0;
_.forEach(carritoUsuario, function (e) {
total += parseFloat(e.Precio) * parseFloat(e.Cantidad);
});
return total;
}
}]);
重写为工厂,仍然是同样的未提供的错误:
MyApp.factory('Carrito', ['Productos', '$scope', '$http',
function (Productos, $scope, $http){
var carritoUsuario = [];
var todosLosProductos = Productos.todos();
var unProducto = function() {
this.Nombre = "";
this.stockid = 0;
this.Descripcion = "";
this.Precio = 0;
this.Familia = 1;
this.Modificadores = [];
this.Cantidad = 1;
this.SKU = function () {return "" + this.stockid +
this.Modificadores.mod1 + this.Modificadores.mod2 +
this.Modificadores.mod3 + this.Modificadores.mod4 +
this.Modificadores.mod5};
}
/* For now this searches the local array */
return {
findBySKU : function(sku) {
console.log("Finding: " + sku + " from Carrito service findBySKU...");
return _.find(carritoUsuario, function (producto){
return producto.stockid == sku;
});
},
getProducto : function(id) {
console.log("Getting: " + id + " from Carrito service getProducto...");
return Producto.findById(id);
},
getCart : function() {
console.log("Getting cart from Carrito service getCart");
return carritoUsuario;
},
addToCart : function(Prod) {
/* Prod es un ng-model pasasdo por ng-click=addtoCart(producto)
en cualquier boton de compra. Hay que cargar los datos en el html */
console.log("Passed: " + Prod + " -- into Carrito.addToCart...");
unProducto.Nombre = Prod.Nombre;
unProducto.stockid = Prod.stockid;
unProducto.Descripcion = Prod.Descripcion;
unProducto.Precio = Prod.Precio;
unProducto.Familia = Prod.Familia;
unProducto.Cantidad = parseInt(Prod.cantidad);
unProducto.Modificadores = {
"mod1":Prod.mod1,
"mod2":Prod.mod2,
"mod3":Prod.mod3,
"mod4":Prod.mod4,
"mod5":Prod.mod5
};
unProducto.SKU = "" + Prod.stockid + Prod.mod1 + Prod.mod2 + Prod.mod3 + Prod.mod4 + Prod.mod5;
if(angular.isDefined(Carrito.findBySKU(unProducto.SKU))) {
var i = _.findIndex(this.carritoUsuario, unProducto.SKU);
Carrito.carritoUsuario[i].Cantidad++;
} else {
Carrito.carritoUsuario.push(unProducto);
console.log("Added: " + unProducto + " -- to the Carrito...");
}
},
totalCarrito : function() {
var total = 0;
_.forEach(carritoUsuario, function (e) {
total += parseFloat(e.Precio) * parseFloat(e.Cantidad);
});
return total;
}
};
}]);
答案 0 :(得分:0)
你不需要通过&#34; producto&#34;在双花括号中,因为它在一个指令(ng-submit)中。所以......
ng-submit="addToCart(producto)"
相关主题在此解释原因:AngularJS: ng-show / ng-hide