angularjs を使用して e コマース サイトのフロント エンドを作成していますが、これまでに遭遇した唯一の問題は、カートの実装に関連しています。、、およびカートのアイテムCart
へのプロトタイプメソッドを持つ関数を提供するサービスがあります。これは非常に基本的なバージョンです (サービス宣言にラップされています)。add
change
remove
var Cart = function(){
this.items = [];
this.total_price = 0;
this.item_count = 0;
}
Cart.prototype.getItems = function(){ return this.items }
Cart.prototype.getTotal = function(){ return this.total_price }
// Add a product to the cart
Cart.prototype.add = function(product, variant, qty){
// Check if the item is already in the card and add to the quantity
// or create the line item and add it to the list
this.items.push(item)
// Update totals
this.total_price += product.price * qty;
this.item_count += qty;
console.log('Added product. total:', this.getTotal())
}
// Modify a product in the cart
Cart.prototype.change = function(product, variant, qty){
// Find the item or error
existingItem.quantity += qty;
existingItem.line_price += existingItem.price * qty;
}
// Remove an item from the cart
Cart.prototype.remove = function(item){
var index = this.items.indexOf(item);
if (index !== -1) {
this.total_price -= item.line_price;
this.item_count -= item.quantity;
this.items.splice(index, 1);
}
console.log('Removed line item. total:', this.getTotal())
}
return new Cart;
このコードは、直接使用すると非常にうまく機能するように見えますが、コントローラーでバインドすると奇妙な問題が発生します。カートコントローラーは次のとおりです。
app.controller('CartCtrl', [
'$scope',
'Cart',
function($scope, Cart) {
$scope.items = Cart.getItems();
$scope.total = Cart.getTotal();
$scope.delete = function(item){ Cart.remove(item) };
}
]);
製品をカートに追加すると、$scope.items
更新されてng-repeat
ed リストに表示されますが、$scope.total
バインディングは何もしません。console.log
デバッグ中にどこにでも sを配置したため、実際に更新されていることがわかります。$rootScope.$apply()
合計が更新された後にも呼び出しを試みましたが、既に実行されているためエラーになります。
誰にもアイデアはありますか?ご協力いただきありがとうございます!